LEFT JOIN在可空列上。行为是什么?

时间:2014-04-25 10:15:32

标签: mysql sql join left-join relational-algebra

如果您尝试在可能为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值的问题

2 个答案:

答案 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 <=> NULL1'value' <=> NULL0)。另请参阅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')