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
Répondre
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.
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? –
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.
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)
;
- 1. SQL - Y at-il une requête qui fera "foreach A dans la table, si! B, insert B"?
- 2. comment créer la table qui a une colonne d'une autre table dans mySQL
- 3. qui a supprimé une table SQL?
- 4. Écrire une requête SQL pour trouver les valeurs de la colonne A du tableau X qui ne sont pas présentes dans la colonne B de la table Y
- 5. requête SQL Aide - Retour ligne dans la table qui se rapporte à une autre ligne de table avec max (colonne)
- 6. Requête SQL sur une table qui a 2 colonnes avec un identifiant étranger sur la même table
- 7. MySQL: une partie de la table-A se joindre à une partie de la table-B
- 8. Si une table T1 a une seule colonne c1 avec base de données (a, b, b, b, c)
- 9. Comment faire pour joindre à une table qui a plusieurs valeurs dans la colonne?
- 10. ALTER TABLE Sqlite: comment vérifier si une colonne existe avant de modifier la table?
- 11. Comment insérer la ligne une table dans une colonne (PK)?
- 12. Trouver un enregistrement dans la table mysql qui a la valeur la plus élevée
- 13. Dans la table MySQL mettre à jour 'a' enregistrer avec 'b' et 'b' avec 'a'
- 14. Résultats de la requête SQL dans une table
- 15. SQL: Obtenir rapidement la valeur de la colonne B où la colonne A est minimale
- 16. PHP MySQL: Obtenir des lignes du tableau A, où les valeurs de la colonne Z du tableau A pas présent dans la colonne Z de la table B
- 17. SSIS: Comment transférer des données de la table A vers la table B puis mettre à jour la table Une colonne d'indicateur pour chaque ligne
- 18. Comparer les colonnes de la table Oracle dans SQL
- 19. Requête SQL qui ressemble à la même table
- 20. Récupérer des champs d'une table qui a la même relation avec une autre table
- 21. SQL: valeurs similaires cluster de la colonne B, mais "ordre" par la colonne A
- 22. Entity Framework 4: Héritage (table par type) - La table dérivée a un PK composite
- 23. Vérifier si la table existe dans C#
- 24. Recherche d'une table recherche si les enregistrements correspondants de la table enfant existent dans ANSI SQL
- 25. Fonction de table SQL ou moyen de dire si la colonne d'identité a été utilisée?
- 26. Comment sélectionner une table à partir de la table la plus élevée utiliser requête LinQ
- 27. Une requête qui montre les changements d'une colonne d'une table
- 28. procédure stockée qui me résolvent les noms de la colonne de la table
- 29. A propos de la clé primaire dans la table?
- 30. Comment faire pour insérer une ligne d'une table à une autre table (ce qui a moins de colonnes)?
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 –