У меня есть запрос, присоединяющийся к нескольким таблицам и возвращающий довольно много столбцов.
Индексированный столбец другого ссылки на таблицу 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.
Я добавляю средние результаты как комментарии к ответам в случае, если любому интересно. Спасибо все!
Другой вариант:
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
Я бы сказал:
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
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
Использование:
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
, чтобы отображались только уникальные строки.