好吧,我相信我走在正确的轨道上,但在获得理想的结果方面遇到了一些困难。我正在尝试检查表中的两个不同列以获取特定标志,然后将所述标志与第二列相关联。
例如,我说过表:
ID date flag flag_id
-----------------------------------
1 09/25/2017 NO 0001
2 09/25/2017 OTHER 0002
3 09/25/2017 NO 0002
4 09/25/2017 OTHER 0003
5 09/25/2017 OTHER 0004
6 09/25/2017 NO 0005
7 09/25/2017 OTHER2 0005
8 09/25/2017 OTHER 0006
需要输出的是包含重复flag_id
的行以及仅在其标志列中包含NO
的行,不包括NO
行本身(因此只有行数据未显示NO
)。所以在这种情况下只输出第2行和第7行。我已经写了一些看起来像这样的东西:
SELECT distinct
t1.ID,
t1.date,
t1.flag,
t1.flag_id,
FROM table1 t1
WHERE (SELECT COUNT(*)
FROM table1 t2
WHERE t1.flag_id = t2.flag_id
AND t1.flag != 'NO'
AND t2.flag = 'NO')>1
在这里犯了一个初学者的错误,并且请注意,我对此仍然很陌生,所以对于为什么这不起作用或为什么其他工作原理的解释将不胜感激。
答案 0 :(得分:1)
您可以改用EXISTS:
SELECT
t1.ID,
t1.date,
t1.flag,
t1.flag_id
FROM table1 t1
WHERE exists (SELECT 1
FROM table1 t2
WHERE t1.flag_id = t2.flag_id
AND t1.flag != 'NO'
AND t2.flag = 'NO')
当您有多个不同的标志时也可以使用:
MS SQL Server 2014架构设置:
CREATE TABLE Table1
([ID] int, [date] datetime, [flag] varchar(10), [flag_id] int)
;
INSERT INTO Table1
([ID], [date], [flag], [flag_id])
VALUES
(1, '2017-09-25 10:00:00', 'NO', 0001),
(2, '2017-09-25 10:00:00', 'OTHER', 0002),
(3, '2017-09-25 10:00:00', 'NO', 0002),
(4, '2017-09-25 10:00:00', 'OTHER', 0003),
(5, '2017-09-25 10:00:00', 'OTHER', 0004),
(6, '2017-09-25 10:00:00', 'NO', 0005),
(7, '2017-09-25 10:00:00', 'OTHER', 0005),
(8, '2017-09-25 10:00:00', 'OTHER2', 0005),
(9, '2017-09-25 10:00:00', 'OTHER', 0006)
;
查询1 :
SELECT
t1.ID,
t1.date,
t1.flag,
t1.flag_id
FROM table1 t1
WHERE exists (SELECT 1
FROM table1 t2
WHERE t1.flag_id = t2.flag_id
AND t1.flag != 'NO'
AND t2.flag = 'NO')
<强> Results 强>:
| ID | date | flag | flag_id |
|----|----------------------|--------|---------|
| 2 | 2017-09-25T10:00:00Z | OTHER | 2 |
| 7 | 2017-09-25T10:00:00Z | OTHER | 5 |
| 8 | 2017-09-25T10:00:00Z | OTHER2 | 5 |
答案 1 :(得分:0)
您的输出对查询没有意义。这将返回标志不是No的所有行但是还有另一行标志为No。请注意,如果这是查询停止的位置,则使用exists更有效。如果您想扩展查询,可能会更好。
SELECT distinct
t_other.ID,
t_other.date,
t_other.flag,
t_other.flag_id,
FROM table1 t_no
inner join table1 t_other on t_no.flag_id = t_other.flag_id
WHERE t_no.flag = 'NO' and t_other.flag <> 'NO'