Mysql 左联接缺少右表中的值

Mysql 左联接缺少右表中的值,mysql,sql,left-join,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

我试图将一个表拆分为两个引用表,但其中一个新表的填充有问题。假设旧表包含列
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

类型,您的连接条件不处理空值。如果你想找回所有的原始值,你必须处理它们

对每个可以包含空值的列使用类似的方法

(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`;
插入新表格1
选择oldTable.`A`
,旧桌子`
,旧桌子`
,newtable 2.`ID`
从旧桌子
左联接新表2
在newtable上2.`X`oldTable.`X`
和新表2.`Y`旧表。`Y`
和newtable 2.Z`oldTable.Z`;

X、Y和Z是否可以为空?其中至少有一个?@Pred它们都可以为NULL,是否相关?NULL在连接条件中不等于NULL。处理空值,您将发现您的值扫描您添加了一些样本数据,给出了错误的结果和预期的结果。(尽量少列,多行样本数据。)@Pred这肯定是我的问题,因为大多数行中至少有一行为空。