当我执行以下查询时:
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)
这将返回两个表中与另一个表上没有匹配项的行.
这不起作用的原因是因为你将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)
| 归档时间: |
|
| 查看次数: |
22465 次 |
| 最近记录: |