为表A中的每个项目返回表B中的所有非活动项

时间:2018-05-07 19:14:32

标签: sql oracle

不确定我是否可以用语言解释这个......

我想在表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”,但这似乎不适用于此。

任何帮助将不胜感激!

3 个答案:

答案 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

这能满足您的需求吗?

相关问题