如果您尝试在可能为NULL的列上加入,则不清楚LEFT JOIN的行为是什么。
例如。
SELECT columns
FROM
EmployeePayment ep JOIN EmployeePaymentGroup g ON g.group_id = ep.group_id AND g.subsidiary_id = ep.subsidiary_id
LEFT JOIN EmployeeSalaryDetails esd USING (department_id)
LEFT JOIN Employee e ON e.id = esd.emp_id
如果EmployeePayment和EmployeePaymentGroup的 INNER JOIN返回1条记录 ,然后EmployeeSalaryDetails上的第二个 LEFT JOIN保留此记录会发生什么> 但是此记录的esd.emp_id为NULL值,并尝试在该NULL值上对员工进行LEFT JOIN。
我知道NULL很棘手,所以我想知道LEFT JOIN如何处理NULL
注意:
我之前提出了一个关于JOIN的问题,但是Abhik Chakraborty的评论让我意识到条件中存在NULL值的问题
答案 0 :(得分:3)
如果您有LEFT JOIN
并且右表没有返回任何内容(NULL
),则投影中属于右表的所有字段都只是NULL
,但您仍然可以获得结果从左边的桌子。 RIGHT JOIN
具有相反的行为,INNER JOIN
不会返回任何内容。
SELECT * FROM `left_table` LEFT JOIN `right_table`
NULL = NULL
评估为UNKNOWN
(这意味着“不,不加入,因为我不知道如果我们被允许的话。”)并且投影将仅包含左表的结果
当然有办法解决这个问题:
SELECT *
FROM `left_table` AS `l`
LEFT JOIN `right_table` AS `r`
ON `r`.`id` <=> `l`.`id`
现在对NULL
的检查将会像您以前一样正常工作(NULL <=> NULL
为1
且'value' <=> NULL
为0
)。另请参阅equal to运算符的文档。
答案 1 :(得分:-1)
您可以使用isnull(cast())函数转换类型中的空记录,并为其提供一个也在employee列中的值,以便根据该值加入它们。
LEFT JOIN EmployeeSalaryDetails esd on isnull((esd.department_id, "input here value of id") = "input here the value of the column"
以下是一个例子:
Inner join FORECAST_Claims b on (isnull(cast(a.Durg_Key as varchar(20)),'UNKNOWN') = isnull(cast(b.Durg_Key as varchar(20)),'UNKNOWN')