2010-05-21 4 views
1

Comment puis-je écrire une requête SQL efficace qui retourne les colonnes de la table A plus une colonne bit qui spécifie si de la table A existe dans le tableau B? J'utilise MS SQLServer 2005. Merci.Requête SQL qui retourne les colonnes de la table A plus une colonne bit qui spécifie si le PK de la table A existe dans la table B

+0

Merci. Toutes les réponses utiles J'ai choisi la réponse de Remus parce qu'elle utilisait la jointure gauche au lieu de la sous-requête –

Répondre

1

Cela dépend si la relation de table étrangère est 1: 1 ou 1: Many. Si est 1: 1, vous pouvez utiliser une jointure normale:

select A.*, case when b.id is null then 0 else 1 end 
from A 
left join B on A.id = B.id; 

Si la relation est 1: Beaucoup la jointure se multiplier le résultat, vous devez restreindre, et il y a plusieurs façons. Une façon simple utilise appliquer extérieur et le haut:

select A.*, case when b.id is null then 1 else 0 end 
from A 
outer apply (
select top (1) id from B where A.id = B.id) as b; 

En ce qui concerne la performance, la quasi-totalité solution proposée fait la même chose, à la condition est un indice approprié sur B (id) en place.

+0

Merci, exactement ce dont j'avais besoin. Je ne connais pas la fonction externe d'application mais quelle est la différence entre l'utilisation externe et l'utilisation de distinct? –

0

Je suppose que la clé primaire dans la table A est appelée PK et que la colonne dans B qui contiendrait cette clé est également appelée PK.

SELECT A.*, CASE WHEN EXISTS (SELECT 1 FROM B WHERE B.PK = A.PK) THEN 1 ELSE 0 END 
FROM A 

L'efficacité de cette requête dépendra de l'indexation dans le tableau B - en particulier, si la colonne PK est indexé.

Je n'aime pas SELECT * en général, mais pour cet exemple, cela sert le but.

1

Les autres réponses spécifient une sous-requête corrélée; une jointure (externe gauche) est probablement plus efficace.

Je supposerai que b.fk est la clé étrangère dans b à a pk.

select 
    a.*, 
    case when b.fk is not null then 1 else 0 end as exists_in_b 
from 
    a 
    left outer join b on (a.id = b.fk) 
; 
Questions connexes