Левое соединение, чтобы показать нулевые строки + где


У меня есть две таблицы, одна из которых содержит уникальные имена (bill_datatypes), а другая выражает, что эти имена связаны с некоторыми подкатегориями (одно имя может быть связано с несколькими категориями).

Первая таблица (соответствующая часть):
Первая таблица (соответствующая часть)

Вторая таблица (соответствующая часть):
Вторая таблица (соответствующая часть)

Я хотел бы выделить все имена, которые еще не связаны с конкретной подкатегорией. Это означает, что имена может быть упомянут в соединительной таблице, но связан с другой подкатегорией.

Я решил задачу следующим подзапросом:

SELECT T1.name
FROM bill_datatype T1
WHERE NOT EXISTS (

SELECT T2.bill_datatype_id
FROM obligatory_field T2
WHERE T2.bill_datatype_id = T1.id AND T2.bill_sub_category_id = 1

)

Это решение, кажется, работает хорошо, но таким образом я не могу иметь никаких данных из второй таблицы, которые могли бы понадобиться в будущем.

Есть ли у вас какие-либо предложения о том, как решить проблему с левым соединением? (Пункт WHERE в подкатегории сделал его слишком сложным для меня.)

Спасибо за вашу помощь также в вперед!

2 2

2 ответа:

Из того, как я понимаю ваш вопрос, я думаю, что этот запрос достигнет того, что вы хотите:

SELECT T1.name
FROM bill_datatype T1
LEFT JOIN obligatory_field T2
ON T2.bill_datatype_id = T1.id AND T2.bill_sub_category_id = 1
WHERE T2.bill_datatype_id IS NULL

Условие WHERE в таблице JOIN'ed даст вам только имена из T1, которые не имеют bill_sub_category_id или их bill_sub_category_id не 1.

SQLFiddle

SELECT distinct T1.name
FROM 
bill_datatype T1 
right join
(

SELECT T2.bill_datatype_id
FROM obligatory_field T2
WHERE  T2.bill_sub_category_id = 1

) 
as T3
on T1.id != T3.bill_datatype_id 

Http://sqlfiddle.com/#! 9 / d4f616/18