Запрос таблицы на предмет наличия соответствующих записей дочерней таблицы в ANSI SQL - PullRequest
1 голос
/ 10 марта 2010

У меня есть две таблицы A и B, где есть отношение один ко многим.

Теперь я хочу получить несколько записей от A и с этим полем существования, которое показывает, есть ли у B совпадающие записи. Я не хочу использовать функцию count, поскольку в B слишком много записей, которые задерживают выполнение SQL. Либо я не хочу использовать проприетарные ключевые слова, такие как rownum Oracle, как показано ниже, поскольку мне нужна как можно большая совместимость.

select A.*, (
    select 1 from B where ref_column = A.ref_column and rownum = 1
) existence
...

Ответы [ 2 ]

1 голос
/ 10 марта 2010

В любом случае вы бы использовали левое объединение + счетчик, оператор выбора в списке выбора может выполняться несколько раз, тогда как объединение будет выполняться только один раз.

Также вы можете рассмотреть СУЩЕСТВУЮЩИЕ:

select A.*, case when exists (
    select 1 from B where ref_column = A.ref_column and rownum = 1
) then 1 else 0 end
0 голосов
/ 10 марта 2010

Используйте предложение EXISTS. Если внешний ключ в B проиндексирован, производительность не должна быть проблемой.

SELECT *
FROM a
WHERE EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)
...