1
liprais 2023-06-26 13:55:08 +08:00 1
用 exists
select a from T1 where not exists (select 1 from T2 where t2.a = t1.a) |
2
monmon 2023-06-26 13:58:10 +08:00 1
NOT IN 操作符子查询,在大数据集上运行可能会非常慢,当子查询返回大量数据时,NOT IN 的性能可能会下降,因为它需要对子查询返回的每个值进行比较。
可以考虑使用`NOT EXISTS`或者`LEFT JOIN/IS NULL`来提高性能 ```mssql SELECT a FROM T1 WHERE NOT EXISTS (SELECT 1 FROM T2 WHERE T1.a = T2.a); ``` ```mysql SELECT T1.a FROM T1 LEFT JOIN T2 ON T1.a = T2.a WHERE T2.a IS NULL; ``` |
3
8355 2023-06-26 13:59:05 +08:00 1
left join T2
where T2.a is null not in 挺差的 |
4
opengps 2023-06-26 14:00:09 +08:00 2
用左联接比用 in 靠谱
|
5
LeegoYih 2023-06-26 14:00:47 +08:00 1
改少查多的场景下:T1 表新增标识字段,新增 /删除 T2 表的时候,同时更新 T1 表对应数据的标识。
改多查少的场景下:用 not in/not exists 都可以 |
6
DissDoge 2023-06-26 16:20:43 +08:00 2
可以考虑使用 LEFT JOIN 和 NULL 值判断来优化,避免使用子查询。
SELECT T1.a FROM T1 LEFT JOIN T2 ON T1.a = T2.a WHERE T2.a IS NULL; 使用 LEFT JOIN 将 T1 表和 T2 表连接起来,根据 a 列进行匹配。在 WHERE 子句中,筛选出 T2.a 为 NULL 的记录,这表示在 T1 表中有数据但在 T2 表中没有数据。这种方式比使用子查询效率更高,可以减少查询时间。 另外,确保在 T1 表和 T2 表的 a 列上都创建了索引,这样可以进一步提升查询性能。 |
7
fatyoung OP 谢谢所有回复,受教了
|