T-SQL 查询 - 如何不包含来自不同行的某些结果
T-SQL Query - How to not include some results from different row
我有如下数据。
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。
从这个数据库结构来看这甚至可能吗?
您需要排除任何包含值 'B' 的 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'
这是另一个查询:
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')
即使你接受了一个答案,我也会写另一个变体。我认为它更容易编写和理解。在性能方面,您必须检查不同的变体如何使用您的真实数据在您的系统上工作。
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
也可以使用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' );
我有如下数据。
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。
从这个数据库结构来看这甚至可能吗?
您需要排除任何包含值 'B' 的 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'
这是另一个查询:
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')
即使你接受了一个答案,我也会写另一个变体。我认为它更容易编写和理解。在性能方面,您必须检查不同的变体如何使用您的真实数据在您的系统上工作。
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
也可以使用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' );