У меня 2 стола (А и Б). Каждая строка в таблице A имеет до 3 соответствий в таблице B. Таблица B имеет поле статуса, которое может быть либо «x», «y», либо «null».

Я хочу получить всю строку из таблицы A, где ни одна соответствующая строка из таблицы B не имеет статуса «X» (см. Рисунок ниже). Итак, в основном я хочу строку с идентификаторами 2 и 3.

enter image description here

Обратите внимание: мой оператор from ДОЛЖЕН БЫТЬ в таблице A.

Пока что я безуспешно пробовал следующее:

select *
from table A
left join table B on a.Id = b.ref
where status = 'Y'
or status is null;

select *
from table A
right join table B on a.Id = b.ref
where status = 'Y'
or status is null;

Проблема в том, что для каждой строки из таблицы A у меня есть строка в таблице B, которая удовлетворяет условию where, поэтому я получаю все 3 строки, а не только одну, выделенную зеленым цветом. Мне нужно сделать что-то вроде «имея все совпадающие строки из таблицы B! =« X »

0
Yannick Richard 13 Мар 2018 в 21:03

2 ответа

Лучший ответ

Идея состоит в том, что вы пытаетесь сопоставить строку в таблице A с кем-либо в таблице B, но только с теми, на которых есть x.

Если вы не можете, вы получите NULL, и это те строки, которые вам нужны.

 SELECT A.*
 FROM TableA as A
 LEFT JOIN TableB as B
   ON A.id = B.Ref
  AND B.status = 'x'
 WHERE B.status is null
2
Juan Carlos Oropeza 13 Мар 2018 в 18:21
Select A.* 
from A 
where A.Id not in (select ref 
                   from B 
                   where B.ref = A.Id 
                     and B.Status = 'X')
1
Juan Carlos Oropeza 13 Мар 2018 в 18:23