LEFT JOIN 右侧缺少值 table
LEFT JOIN missing values from the right table
我正在尝试将 table 拆分为两个引用的 table,但我对其中一个新 table 的人口有疑问。假设旧的 table 有列 A, B, C, X, Y, Z
,第一个新的 table 有 A, B, C, ID
,第二个有 ID, X, Y, Z
.
填充第二个 table 很简单:
INSERT INTO newTable2 (`X`,`Y`,`Z`)
SELECT DISTINCT `X`,`Y`,`Z`
FROM oldTable;
我可以在 运行 之后检查 newTable2
并查看是否已正确填充。 ID
由 table 定义填充,并且没有空值。我似乎无法填充第一个 table。我试图使用这个脚本:
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`;
但是当我检查结果 table 时,我得到的大多数行的 ID
为空值。由于它的填充方式,newTable2
应该有一行,oldTable
的每一行都有 ID
,而且我手动检查过的每一行都有一个空值,但根本找不到。
我是 运行ning 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 情况。我会使用 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`;
我正在尝试将 table 拆分为两个引用的 table,但我对其中一个新 table 的人口有疑问。假设旧的 table 有列 A, B, C, X, Y, Z
,第一个新的 table 有 A, B, C, ID
,第二个有 ID, X, Y, Z
.
填充第二个 table 很简单:
INSERT INTO newTable2 (`X`,`Y`,`Z`)
SELECT DISTINCT `X`,`Y`,`Z`
FROM oldTable;
我可以在 运行 之后检查 newTable2
并查看是否已正确填充。 ID
由 table 定义填充,并且没有空值。我似乎无法填充第一个 table。我试图使用这个脚本:
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`;
但是当我检查结果 table 时,我得到的大多数行的 ID
为空值。由于它的填充方式,newTable2
应该有一行,oldTable
的每一行都有 ID
,而且我手动检查过的每一行都有一个空值,但根本找不到。
我是 运行ning 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 情况。我会使用 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`;