LEFT JOIN右表

时间:2016-03-29 14:22:34

标签: mysql sql left-join

我正在尝试将表拆分为两个引用的表,并且遇到了一个新表的填充问题。假设旧表格中包含A, B, C, X, Y, Z列,第一个新表格为A, B, C, ID,第二个表格为ID, X, Y, Z

填充第二个表格很简单:

INSERT INTO newTable2 (`X`,`Y`,`Z`)
SELECT DISTINCT `X`,`Y`,`Z`
FROM oldTable;

我可以在运行完成后查看newTable2,看看是否已正确填充。 ID由表定义填充,并且没有空值。我似乎在填充第一个表时遇到问题。我试图使用这个脚本:

INSERT INTO newTable1
SELECT oldTable.`A`
     , oldTable.`B`
     , oldTable.`C`
     , newTable2.`ID`
FROM oldTable
LEFT JOIN newTable2
ON newTable2.`X` = oldTable.`X`
    AND newTable2.`Y` = oldTable.`Y`
    AND newTable2.`Z` = oldTable.`Z`;

但是当我检查结果表时,对于大多数行,我得到ID的空值。由于它填充的newTable2应该为ID的每一行都有一行和oldTable,并且我手动检查的每一行都有一个根本找不到的值。

我正在运行MySql 5.7,除ID之外的所有列都属于varchar类型。

2 个答案:

答案 0 :(得分:1)

您的JOIN条件不处理NULL值。如果您想要恢复所有原始值,则必须处理它们。

对每个可包含NULL值的列使用类似的内容。

(newTable2.`X` = oldTable.`X` OR (newTable2.`X` IS NULL AND oldTable.`X` IS NULL))

答案 1 :(得分:1)

正如@Pred所提到的,你应该在Join语句中处理NULL情况。我会使用null-safe <=>运算符来避免使用OR语句:

如下所示:

 INSERT INTO newTable1
    SELECT oldTable.`A`
         , oldTable.`B`
         , oldTable.`C`
         , newTable2.`ID`
    FROM oldTable
    LEFT JOIN newTable2
    ON newTable2.`X` <=> oldTable.`X`
        AND newTable2.`Y` <=> oldTable.`Y`
        AND newTable2.`Z` <=> oldTable.`Z`;