为什么INNER JOIN不等于(!=)永远挂起

I'l*_*ack 12 mysql database

当我执行以下查询时:

SELECT * FROM `table1` 
 INNER JOIN table2 ON table2.number = table1.number
Run Code Online (Sandbox Code Playgroud)

我在2秒内得到了结果.其中有大约600万条记录table2和100万条记录table1

table2.number并table1.number编入索引.

现在我想得到一个不存在的数字列表.像这样:

SELECT * FROM `table1` 
 INNER JOIN table2 ON table2.number != table1.number
Run Code Online (Sandbox Code Playgroud)

它需要永远,仍然悬挂..如何解决?

Álv*_*lez 33

假设您的第一个INNER JOIN返回1,000,000行中的75%table1.第二个查询不会像您想象的那样返回250,000个其他行.相反,它尝试创建笛卡尔积并删除750,000个匹配的行.因此,它试图返回6,000,000×1,000,000-750,000行.这是一个膨胀的6×10 12行结果集.

你可能想要这个:

SELECT * FROM table1
LEFT JOIN table2 ON table2.number = table1.number
WHERE table2.number IS NULL
Run Code Online (Sandbox Code Playgroud)

这将返回table1不存在的行table2.

您可能还对以下内容感兴趣FULL OUTER JOIN:

SELECT * FROM table1
FULL OUTER JOIN table2 ON table2.number = table1.number
WHERE table1.number IS NULL AND table2.number IS NULL
Run Code Online (Sandbox Code Playgroud)

这将返回两个表中与另一个表上没有匹配项的行.


Ian*_*ton 6

这不起作用的原因是因为你将table1的每一行基本连接到表2的每一行.你还需要一些东西来加入它.执行此操作的最佳方法是执行左连接(意味着它将连接table1,无论是什么,而不是table2),然后检查以确保没有table2的条目,其中is为null.然后你需要为table2做同样的事情.

SELECT * FROM `table1` 
LEFT JOIN table2 ON table2.number = table1.number 
WHERE table2.number is NULL

UNION

SELECT * FROM `table2` 
LEFT JOIN table1 ON table2.number = table1.number 
WHERE table1.number is NULL
Run Code Online (Sandbox Code Playgroud)