LEFT JOIN显示NULL行+ WHERE

时间:2018-07-26 11:24:20

标签: mysql join subquery left-join

我有两个表,一个表包含唯一的名称(bill_datatypes),另一个表表示这些名称连接到某些子类别(一个名称也可以连接到更多类别)。

第一张表(相关部分):
The first table (relevant part)

第二张表(相关部分):
The second table (relevant part)

我想选择所有尚未连接到特定子类别的名称。这意味着名称可能会在连接表中提及,但已连接到其他子类别。

我已通过以下子查询解决了该问题:

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

)

此解决方案似乎效果很好,但是通过这种方式,我无法从第二张表中获得任何数据,将来可能会需要。

您对使用LEFT JOIN解决问题有任何建议吗? (子类别的WHERE子句对我来说太具有挑战性了。)

也提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

根据我对您问题的理解,我认为该查询将实现您想要的目标:

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的名称。 / p>

SQLFiddle

答案 1 :(得分:0)

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