T-SQL查询 - 如何不包含来自不同行的一些结果

时间:2015-01-26 23:23:35

标签: sql sql-server tsql

我有类似下面的数据。

ID | Value 
------------    
 1 | A 
 1 | B 
 1 | C 
 2 | A 
 2 | C
 3 | C

我试图获得有A但不包括B的ID。

在这种情况下,我只能得到ID 2。

如果我查询

SELECT DISTINCT ID 
FROM TABLE 
WHERE (VALUE = 'A' AND VALUE <> 'B')

我得到1和2。

这甚至可以从这个数据库结构中获得吗?

4 个答案:

答案 0 :(得分:2)

您需要排除任何包含值&#39; B&#39;的ID。你可以用左连接和空检查来做到这一点......即没有匹配。

select d.*
from data d
    left join (select id from data where value = 'B') x --exclude these
        on d.id = x.id
where x.id is null
    and d.value = 'A'

答案 1 :(得分:1)

即使您接受了答案,我也会写另一个变体。我认为写作和理解更容易。在性能方面,您必须检查不同变体在您的系统上如何使用您的真实数据。

DECLARE @T TABLE (ID int, Value char(1));

INSERT INTO @T (ID, Value) VALUES (1, 'A');
INSERT INTO @T (ID, Value) VALUES (1, 'B');
INSERT INTO @T (ID, Value) VALUES (1, 'C');
INSERT INTO @T (ID, Value) VALUES (2, 'A');
INSERT INTO @T (ID, Value) VALUES (2, 'C');
INSERT INTO @T (ID, Value) VALUES (3, 'C');

SELECT ID FROM @T WHERE Value = 'A'

EXCEPT

SELECT ID FROM @T WHERE Value = 'B'

结果集:

ID
2

答案 2 :(得分:0)

这是另一个查询:

select distinct tb.ID from tbl_name tb
where tb.Value='A' and tb.ID not in(select distinct tbl.ID from tbl_name tbl
where tbl.Value='B')

答案 3 :(得分:0)

还可以使用WHERE NOT EXISTS

SELECT t1.id FROM table t1
 WHERE t1.value = 'A'
   AND NOT EXISTS ( SELECT 1 FROM table t2
                     WHERE t2.id = t1.id
                       AND t2.value = 'B' );