2010-03-10 3 views
1

J'ai deux tables A et B où il existe une relation un-à-plusieurs.Recherche d'une table recherche si les enregistrements correspondants de la table enfant existent dans ANSI SQL

Maintenant je veux des enregistrements de A et avec ce champ d'existence qui montre si B a des enregistrements correspondants. Je ne veux pas utiliser la fonction count car B a trop d'enregistrements qui retardent l'exécution SQL. Soit je ne veux pas utiliser des mots-clés propriétaires comme rownum d'Oracle comme ci-dessous, car j'ai besoin de la plus grande compatibilité possible.

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

Répondre

0

Utilisez une clause EXISTS. Si la clé étrangère dans B est indexée, la performance ne devrait pas être un problème.

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

Votre code ne renvoie pas les enregistrements de A qui n'ont pas les enregistrements correspondants dans B. – DylanYi

1

Vous utiliseriez gauche + compte également suivre une toute façon, instruction select dans la liste de sélection peut être exécuté plusieurs fois en join faire qu'une seule fois.

Aussi, vous pouvez envisager EXISTE:

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: Je voudrais ajouter le nom (alias) à cette colonne . Je ne pense pas que 'rownum' est ANSI SQL. Dans SQL Server, ce serait 'SELECT TOP 1', à la place, dans MySQL,' LIMIT 1'. Pour obtenir une implémentation vraiment 'ANSI SQL',' LEFT JOIN' est requis, où 'COUNT (*)' serait remplacé par 'CASE WHEN COUNT (*) ...' – van

Questions connexes