以下是我的表格结构
Table 1
id
name
Table 2
id
table1_id
我希望表1中的行在表2中没有参考值。
示例数据:
Table 1
id name
1 demo
2 demo2
3 demo3
表2
id table1_id
1 1
2 1
3 1
4 3
5 3
因此表2中没有table1_id 2的值。我希望表1中的id为2。
下面是我尝试的查询ID:
SELECT l.id FROM Table1 l WHERE l.id NOT IN (SELECT DISTINCT(r.id) FROM table2 r);
这会返回一个合适的结果,但处理时间超过2分钟。
在表1中,我有4000行;在表2中,我有40000行。
对上述查询或任何替代解决方案的任何优化?
答案 0 :(得分:3)
SELECT * FROM table1 LEFT JOIN table2
ON table1.id=table2.table1_id
WHERE table2.table1_id IS NULL
答案 1 :(得分:1)
拥有Table1.id
和Table2.table1_id
的索引,然后尝试以下查询:
SELECT Table1.id FROM Table1
WHERE Table1.id NOT IN (SELECT Table2.id FROM Table2 group by Table2.table1_id);
答案 2 :(得分:1)
您想要实现的目标是找到孤儿记录吗?
显示来自第一个(左)表的所有记录的连接以及匹配值形成另一个或没有匹配的空值的连接称为左连接。我认为左连接会做同样的工作,但它不会更快。加入通常较慢。
我找到了一个很好解释的地方 - http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/
尝试使用联接并没有什么坏处,并告诉我们您的结果与预期相同。
答案 3 :(得分:0)
select t1.id from table1 as t1
left outer join table2 as t2
on t2.table1_id = t1.id
where t2.id is null;
或
select t1.id from table1 as t1
where not exists (select 1
from table2 as t2 where t2.table1_id = t1.id);