不确定我是否可以用语言解释这个......
我想在表B中找到表A中每个项目都处于非活动状态的所有项目。假设表A只有列“item”而表B有列“item”和“active”
Table A Table B
A A | 1
A A | 1
A B | 1
B B | 0
B C | 0
B C | 0
C D | 0
C E | 1
D
E
F
在该示例中,它应该返回C和D.
我设法将表A和B与group by子句一起加入,但不知道从哪里开始。试图环顾四周,只发现其他表的值不存在的答案所以你可以使用“NOT IN”,但这似乎不适用于此。
任何帮助将不胜感激!
答案 0 :(得分:2)
使用NOT EXISTS
:
select distinct a.item
from table_A a
where not exists (select 1 from table_B b where b.item = a.item and b.status = 1);
答案 1 :(得分:2)
您可以加入表格并使用HAVING
子句进行比较,如下所示:
SELECT ta.Item
FROM TableA tA
LEFT JOIN TableB tB
ON tA.Item=tB.Item
GROUP BY tA.Item
HAVING SUM(tB.Inactive)=COUNT(tb.Inactive)
这将为您提供TableA中不同的项目列表
以上查询假定1为非活动且0为活动。如果您的数据相反(看起来是这样),您可以改为:
SELECT ta.Item
FROM TableA tA
LEFT JOIN TableB tB
ON tA.Item=tB.Item
GROUP BY tA.Item
HAVING SUM(tB.Inactive)=0
这也会返回项目F,因为它没有表b中的值到SUM。如果您不想让物品F返回,只需将LEFT JOIN
翻转到INNER JOIN
。
如果需要返回TableA中的所有实例,可以使用子查询并加入到:
SELECT ta.Item
FROM TableA tA
LEFT JOIN (SELECT ITEM, SUM(ACTIVE) Sum0 FROM TableB GROUP BY ITEM)tB
ON tA.Item=tB.Item
WHERE tB.Sum0 = 0
/*or tB.Sum0 is null would give you Item F*/
答案 2 :(得分:-1)
我相信你只需要在表名上加入表格并过滤到活动列上只有0的值。
SELECT B.*
FROM TableA A INNER JOIN TableB B ON A.item = B.item
WHERE B.active = 0
这能满足您的需求吗?