2010-03-10 3 views
1

У меня есть две таблицы A и B, где есть отношения «один ко многим».Запрос таблицы, если существуют записи соответствия дочерней таблицы в ANSI SQL

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

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

ответ

0

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

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

Ваш код не возвращает записи А, не соответствующие записи в B. – DylanYi

1

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

Также вы можете рассмотреть EXISTS:

select A.*, case when exists (
    select 1 from B where ref_column = A.ref_column and rownum = 1 
) then 1 else 0 end 
+0

+1: Я хотел бы добавить имя (псевдоним) для этого столбца , Я не думаю, что 'rownum' является ANSI SQL. В SQL Server это будет «SELECT TOP 1», а в MySQL это будет «LIMIT 1». Чтобы получить реальную реализацию 'ANSI SQL', требуется' LEFT JOIN', где 'COUNT (*)' будет заменен на 'CASE WHEN COUNT (*) ...' – van