Оптимизация нескольких операторов IF-IN-SELECT в SQL - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать столбцы "flag", чтобы увидеть, находятся ли первичные ключи моей основной таблицы в других таблицах:

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

Я делаю это несколько раз с десятью таблицами (т.е. создание около десяти новых столбцов, каждый из другой таблицы), и все участвующие таблицы имеют около пары миллионов строк. Пока что это лот медленнее, чем я ожидал. Есть ли лучший способ написать этот запрос, или есть ли способ оптимизировать его?

1 Ответ

2 голосов
/ 03 марта 2020

Использование существует 1. Приятно то, что вам не нужно делать отдельную запись, вам не нужно получать все записи, вам просто нужно подтвердить одно существование идентификатора.

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 
...