【发布时间】:2021-05-07 09:50:19
【问题描述】:
(SQL2014 如果有区别的话)
假设我有 [tableA]
id ResultID SampleID ERRORCODE col4 colN
1 9001 1100 0 ... ...
2 9002 1100 100 ... ...
3 9003 1100 200 ... ...
4 9004 1100 300 ... ...
5 9005 1101 0 ... ...
6 9006 1101 0 ... ...
7 9007 1101 0 ... ...
8 9008 1101 0 ... ...
9 9009 1102 0 ... ...
10 9010 1102 100 ... ...
11 9011 1102 200 ... ...
12 9012 1102 0 ... ...
我想生成一个只显示包含所有错误代码 0、100、200 和 300 的样本集(由 common SampleID vals 标识)的结果。即上述内容将减少为:
id ResultID SampleID ERRORCODE col4 colN
1 9001 1100 0 ... ...
2 9002 1100 100 ... ...
3 9003 1100 200 ... ...
4 9004 1100 300 ... ...
所以我需要一个查询,它一次查看多行并向下选择具有 (i) 列中某些键值的组,这里是 [ERRORCODE] 和 (ii) 另一列中的值一致,这里是[SampleID]。我看过:
Query with multiple IN clause on multiple rows
但没有任何快乐。适用于 oliboon 的子查询对我来说只适用于一行。 Olga 的代码根本不起作用,而 Aushin 的代码产生了意想不到的结果(删除一半的语法并没有改变它们)!
N00b 到 SQL,所以我有点迷路了!
在列出的一些解决方案中使用的“table”关键字似乎对我不起作用 - 可能是这些答案旨在创建一个子表,然后在子查询中对其解决方案进行进一步解析。如果我尝试类似的方法,我得到的只是“关键字表附近的语法不正确”错误:
select distinct SampleID from table [my].[db].[path].[tableA]
我想到了格式的查询
SELECT *
From [tableA]
where
[SampleID] in (Select [SampleID] from [tableA] where [ERRORCODE] = 0) and
[SampleID] in (Select [SampleID] from [tableA] where [ERRORCODE] = 100)
会起作用,但它只返回一个结果,如果两个 [ERRORCODE] 检查是针对相同的代码,即 100。这当然是无用的。它逐行检查而不是执行逻辑门的第一部分,然后是第二部分。
如果我能够完成 [ERRORCODE]=0 的第一部分,然后从 [ERRORCODE]=100 的那些 SampleID 中向下选择并重复,那么就可以了。不过不知道该怎么做。
编辑:Ach FFS。事实证明,我正在寻找的每一个错误代码都必须相互排斥——无论是什么组合,都不能同时出现两个错误代码。我假设在我拥有的数据库的大小中,某处会有一个组合。
我使用错误代码检查我的查询,我可以从一个不合格的 SELECT * 中看到它们并排放置并证明它有效。
我想问题是无效的。
【问题讨论】:
-
用你的 DBMS 标记问题,我猜是 sql-server。
-
我不明白为什么您显示的查询不起作用。添加两个缺少的
IN子句,您应该得到所有样本 ID 为 1100 的行。当然,您应该添加一个ORDER BY子句,以按您想要的顺序获取行。 -
"我想这个问题是无效的。" - 好的,然后删除它:-)
标签: sql sql-server ssms-18