Oracle: Проверьте, существуют ли строки в другой таблице

У меня есть запрос, присоединяющийся к нескольким таблицам и возвращающий довольно много столбцов.

Индексированный столбец другого ссылки на таблицу PK одной из этих объединяемых таблиц. Теперь я хотел бы добавить другой столбец к запросу, который указывает, существует ли по крайней мере одна строка с тем идентификатором в новой таблице.

Таким образом, если у меня есть одна из старых таблиц

ID
 1
 2
 3

и новая таблица

REF_ID
1
1
1
3

затем я хотел бы добраться

ID   REF_EXISTS
 1            1
 2            0
 3            1

Я могу думать о нескольких способах сделать это, но каков самый изящный/эффективный?


ОТРЕДАКТИРУЙТЕ я проверил производительность запросов, которым предоставляют 50 000 записей в старой таблице, любая запись, подобранная двумя строками в новой таблице, таким образом, половина записей имеет REF_EXISTS=1.

Я добавляю средние результаты как комментарии к ответам в случае, если любому интересно. Спасибо все!

5
задан Peter Lang 19 December 2009 в 20:10
поделиться

4 ответа

Другой вариант:

select O.ID
    , case when N.ref_id is not null then 1 else 0 end as ref_exists
from old_table o
left outer join (select distinct ref_id from new_table) N
   on O.id = N.ref_id
7
ответ дан 18 December 2019 в 14:47
поделиться

Я бы сказал:

select distinct ID,
       case when exists (select 1 from REF_TABLE where ID_TABLE.ID = REF_TABLE.REF_ID)
    then 1 else 0 end
    from ID_TABLE

Если у вас есть индексы на PK и FK, вы сможете сканировать таблицы и выполнять поиск по индексу.

С уважением. K

4
ответ дан 18 December 2019 в 14:47
поделиться

A join может возвращать несколько строк для одного идентификатора, как это делается для id = 1 в данных примера. Вы можете ограничить его одной строкой для каждого идентификатора с помощью группы:

SELECT 
    t1.id
,   COUNT(DISTINCT t2.ref_id) as REF_EXISTS
FROM TABLE_1 t1
LEFT JOIN TABLE_2 t2 ON t2.ref_id = t1.id
GROUP BY t1.id

Группа по гарантирует, что для каждого идентификатора будет только одна строка. И count (разные t2. ref_id) будет 1, если строка найдена, и 0.

РЕДАКТИРОВАТЬ: Вы можете переписать его без группы с помощью , но я сомневаюсь, что это упростит задачу:

SELECT 
    t1.id
,   CASE WHEN EXISTS (
        SELECT * FROM TABLE_2 t2 WHERE t2.ref_id = t1.id)
        THEN 1 ELSE 0 END as REF_EXISTS
,   ....
FROM TABLE_1 t1
1
ответ дан 18 December 2019 в 14:47
поделиться

Использование:

   SELECT DISTINCT t1.id,
          CASE WHEN t2.ref_id IS NULL THEN 0 ELSE 1 END AS REF_EXISTS
     FROM TABLE_1 t1
LEFT JOIN TABLE_2 t2 ON t2.ref_id = t1.id

Добавлен DISTINCT , чтобы отображались только уникальные строки.

1
ответ дан 18 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: