自然连接有效但不适用于所有值
Natural join works but not with all values
我不明白发生了什么...
我使用两个 sql 查询,它们 return 不是同一件事...
这个:
SELECT * FROM table1 t1 JOIN table1 t2 on t1.attribute1 = t2.attribute1
我得到 10 行
另一个:
SELECT * FROM table1 NATURAL JOIN table1
我得到 8 行
NATURAL JOIN
2 行未 returned...我寻找缺失的行,它们与 attribute1
列的值相同.. .
这对我来说是不可能的。
如果有人有答案我可以睡得更好^^
此致
最大值
正如评论中所指出的,您获得不同行数的原因是自然连接使用 all 列连接您的自连接。正在比较所有列,因为相同的 table 出现在联接的两侧。要检验这个假设,只需检查两个 table 的列值,它们应该都匹配。
这里故事的寓意是避免自然连接。除了连接条件不清楚之外,如果 table 结构发生变化,连接的逻辑很容易改变,例如如果添加了新列。
按照下面的 link 进行尝试重现您当前结果的小型演示。在 8 条记录的 table 中,自然连接 returns 8 条记录,而由于某些重复匹配,一个属性上的内部连接 returns 10 条记录。
您需要 'project away' 您不想在联接中使用的属性,例如在派生的 table (dt
):
SELECT *
FROM table1
NATURAL JOIN ( SELECT attribute1 FROM table1 ) dt;
我不明白发生了什么...
我使用两个 sql 查询,它们 return 不是同一件事...
这个:
SELECT * FROM table1 t1 JOIN table1 t2 on t1.attribute1 = t2.attribute1
我得到 10 行
另一个:
SELECT * FROM table1 NATURAL JOIN table1
我得到 8 行
NATURAL JOIN
2 行未 returned...我寻找缺失的行,它们与 attribute1
列的值相同.. .
这对我来说是不可能的。 如果有人有答案我可以睡得更好^^
此致 最大值
正如评论中所指出的,您获得不同行数的原因是自然连接使用 all 列连接您的自连接。正在比较所有列,因为相同的 table 出现在联接的两侧。要检验这个假设,只需检查两个 table 的列值,它们应该都匹配。
这里故事的寓意是避免自然连接。除了连接条件不清楚之外,如果 table 结构发生变化,连接的逻辑很容易改变,例如如果添加了新列。
按照下面的 link 进行尝试重现您当前结果的小型演示。在 8 条记录的 table 中,自然连接 returns 8 条记录,而由于某些重复匹配,一个属性上的内部连接 returns 10 条记录。
您需要 'project away' 您不想在联接中使用的属性,例如在派生的 table (dt
):
SELECT *
FROM table1
NATURAL JOIN ( SELECT attribute1 FROM table1 ) dt;