web-dev-qa-db-fra.com

Comment puis-je corriger les noms de corrélation sur cette jointure SQL?

J'ai besoin d'une jointure qui produit trois champs du même nom provenant de deux tables différentes. Lorsque j'essaie d'exécuter ma requête SQL, VS me donne l'erreur suivante.

Les objets "PoliticalFigures" et "PoliticalFigures" dans la clause FROM ont les mêmes noms exposés. Utilisez des noms de corrélation pour les distinguer.

J'ai essayé d'utiliser "AS" pour distinguer ces champs, mais je n'ai pas trouvé de solution de travail. Voici la requête SQL que j'exécute:

SELECT Countries.Name AS Country, PoliticalFigures.Name AS President, PoliticalFigures.Name AS VicePresident FROM Countries
LEFT OUTER JOIN PoliticalFigures ON Countries.President_Id = PoliticalFigures.Id
LEFT OUTER JOIN PoliticalFigures ON Countries.VicePresident_Id = PoliticalFigures.Id

Si ce n'est pas évident d'après le code, ce sont les tableaux.

  • Pays: Id, Nom, President_Id, VicePresident_Id.
  • PoliticalFigures: Id, Name.
  • Table jointe: Pays, président, vice-président

(Remarque, les tables et les champs de mon application ont des noms différents. Je les généralise pour rendre cet exemple plus clair et avec un peu de chance plus pertinent pour les autres.)

(Les outils que j'utilise sont Visual Web Developer 2010 Express et SQL Server 2008 Express.)

25
Logical Fallacy

Utilisez plutôt des alias de table pour chaque référence à PoliticalFigures:

SELECT 
  Countries.Name AS Country, 
  P.Name AS President, 
  VP.Name AS VicePresident
FROM
  Countries
  LEFT OUTER JOIN PoliticalFigures AS P ON Countries.President_Id = P.Id
  LEFT OUTER JOIN PoliticalFigures AS VP ON Countries.VicePresident_Id = VP.Id
35
Michael Berkowski

Donnez à chaque référence à la table un alias:

SELECT
    Countries.Name AS Country,
    P.Name AS President,
    VP.Name AS VicePresident
FROM Countries
LEFT JOIN PoliticalFigures P ON Countries.President_Id = P.Id
LEFT JOIN PoliticalFigures VP ON Countries.VicePresident_Id = VP.Id
19
Bohemian

Dans les normes SQL, l'alias de table vernaculaire est appelé correlation name et l '"alias de colonne" vernaculaire est appelé as clause. Il semble que vous ayez confondu les deux termes.

4
onedaywhen

Vous devez utiliser AS sur les tables pour leur donner des alias:

SELECT Countries.Name AS Country, Pres.Name AS President, Vice.Name AS VicePresident FROM Countries
LEFT OUTER JOIN PoliticalFigures AS Pres ON Countries.President_Id = Pres.Id
LEFT OUTER JOIN PoliticalFigures AS Vice ON Countries.VicePresident_Id = Vice.Id
2
Luis