首页 > 解决方案 > 在 SQL 中优化多个 IF-IN-SELECT 语句

问题描述

我正在尝试创建“标志”列以查看我的主表的主键是否在其他表中:

SELECT
id
,IIF(id IN (
    SELECT DISTINCT id
    FROM dbo.example1
    ), 1, 0) AS example1_flag
,IIF(id IN (
    SELECT DISTINCT id
    FROM dbo.example2
    ), 1, 0) AS example2_flag
--etc.
FROM dbo.main_table

我用大约十个表多次执行此操作(即创建大约十个新列,每个列来自不同的表),并且所有涉及的表都有大约几百万行。到目前为止,它比我预期的要慢得多。有没有更好的方法来编写这个查询,或者有什么方法可以优化它?

标签: sqloptimizationdistinctsql-in

解决方案


使用存在 1. 关于它的好处是你不需要做一个不同的你不需要获取所有记录,你只需要验证一个 id 的存在。

SELECT
id
,
case when exists (
    SELECT 1 FROM dbo.example1 b where a.id = b.id) then 1 else 0 end ) AS example1_flag
,case when exists (
    SELECT 1 FROM dbo.example2 b where a.id = b.id) then 1 else 0 end ) AS example2_flag
--etc.
FROM dbo.main_table a 

推荐阅读