繁体   English   中英

LEFT JOIN 右表中的缺失值

[英]LEFT JOIN missing values from the right table

我正在尝试将一个表拆分为两个引用的表,并且在其中一个新表的填充方面存在问题。 假设旧表有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应该为oldTable每一行都有一个行和ID ,而我手动检查过的每一行都有一个空值,但根本找不到。

我正在运行 MySql 5.7 并且除ID之外的所有列都是varchar类型。

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

对可以包含 NULL 值的每一列使用类似的东西。

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

正如@Pred 提到的,您应该在 Join 语句中处理 NULL 情况。 我会使用空安全<=>运算符来避免 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`;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM