看一下这个:
TblJob
Name, Surname, Job
John, White, Developer
John, Black, Tester
John, Grey, Manager
TblDrinksPref
Name, Surname, Drink
John, White, Coffee
John, Black, Tea
John, Grey, Orange Juice
SELECT * FROM tbljob j JOIN tbldrinkspref p ON j.name = p.name
John, White, Developer, John, White, Coffee
John, White, Developer, John, Black, Tea
John, White, Developer, John, Grey, Orange Juice
John, Black, Tester, John, White, Coffee
John, Black, Tester, John, Black, Tea
John, Black, Tester, John, Grey, Orange Juice
John, Grey, Manager, John, White, Coffee
John, Grey, Manager, John, Black, Tea
John, Grey, Manager, John, Grey, Orange Juice
通过只加入名字,每个表中的每一行都匹配另一个。每个表中的 3 行导致 3x3 表输出;超过行的总和。您将从联接中获得的最多行数是进入联接的行数的乘积。我们称之为笛卡尔积,它通常表明您的 SQL 连接中存在错误。任何连接都可以做到这一点,而不仅仅是外部连接。存在一个连接(称为 CROSS JOIN),其唯一目的是产生一个完美的笛卡尔积的输出,因为有时我们确实想要这样做,但大多数情况下它表明存在问题
你能为这个做什么?通过使您的连接条件更好/更准确,不要将行连接到不相关的行:
SELECT *
FROM tbljob j JOIN tbldrinkspref p
ON j.name = p.name
--the last name is vital to associate rows correctly in this case
AND j.surname = p.surname
如果您编写了一个大型 SQL,并且意外地重复了某些行,则意味着您的一个连接有问题。将它们全部注释回第一个表,并注释选择块,然后在添加连接时继续重新运行 sql。当您看到行数意外增加时,这可能是失败,但请注意连接可能会导致行也会消失,并且您可能会遇到这样一种情况:添加连接可能会导致一半的行消失,因为它们与连接谓词不匹配,而另一半的行会因连接错误而加倍。在评估添加表后行数应该如何变化时,您必须牢记您要连接的数据,而不是实际变化的情况