Вернуть все неактивные элементы из таблицы B для каждого элемента в таблице A - PullRequest
0 голосов
/ 07 мая 2018

Не уверен, смогу ли я объяснить это хорошо словами ...

Я хочу найти все элементы в Таблице 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, но я не знал, куда идти дальше. Пробовал осматриваться и находил ответы только там, где значение другой таблицы не существует, поэтому вы можете использовать «НЕ В», но это, похоже, не работает здесь.

Любая помощь будет оценена!

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Полагаю, вам просто нужно объединить таблицы по имени таблицы и отфильтровать только значение 0 в активном столбце.

SELECT B.*
  FROM TableA A INNER JOIN TableB B ON A.item = B.item
 WHERE B.active = 0

Это дает вам то, что вам нужно?

0 голосов
/ 07 мая 2018

Вы можете объединить таблицы и использовать предложение 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)

Это даст вам четкий список предметов в таблице A

Приведенный выше запрос предполагает, что 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. Просто переверните LEFT JOIN на INNER JOIN, если вы не хотите, чтобы возвращался элемент F.

Если вам нужно вернуть все экземпляры в 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*/
0 голосов
/ 07 мая 2018

Использование 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...