Erreur de nom de colonne ambiguë SQL : une explication détaillée
Lorsque vous travaillez avec des requêtes SQL qui impliquent la jointure de tables, vous pouvez rencontrer une erreur si vous avoir plusieurs colonnes portant le même nom dans les tables jointes. Cette erreur se produit car la base de données ne peut pas déterminer à quelle table appartient la référence de colonne. Dans cet article, nous allons approfondir ce problème et proposer une solution.
Considérez la requête suivante :
SELECT VendorName, InvoiceID, InvoiceSequence, InvoiceLineItemAmount FROM Vendors JOIN Invoices ON (Vendors.VendorID = Invoices.VendorID) JOIN InvoiceLineItems ON (Invoices.InvoiceID = InvoiceLineItems.InvoiceID) WHERE Invoices.InvoiceID IN (SELECT InvoiceSequence FROM InvoiceLineItems WHERE InvoiceSequence > 1) ORDER BY VendorName, InvoiceID, InvoiceSequence, InvoiceLineItemAmount
Dans cette requête, l'erreur se produit en raison de la présence du "InvoiceID " dans les tables "Factures" et "InvoiceLineItems". La base de données ne peut pas discerner de quelle table vous avez l'intention de récupérer la valeur "InvoiceID".
Pour résoudre cette ambiguïté, vous devez spécifier le nom de la table lors du référencement de la colonne. Vous pouvez y parvenir en utilisant soit la notation par points, soit des alias. La notation par points consiste à préfixer le nom de la colonne avec le nom de la table, comme suit :
SELECT VendorName, Invoices.InvoiceID, InvoiceSequence, InvoiceLineItemAmount FROM Vendors JOIN Invoices ON (Vendors.VendorID = Invoices.VendorID) JOIN InvoiceLineItems ON (Invoices.InvoiceID = InvoiceLineItems.InvoiceID) WHERE Invoices.InvoiceID IN (SELECT InvoiceSequence FROM InvoiceLineItems WHERE InvoiceSequence > 1) ORDER BY VendorName, Invoices.InvoiceID, InvoiceSequence, InvoiceLineItemAmount
Vous pouvez également utiliser des alias comme suit :
SELECT v.VendorName, i.InvoiceID, il.InvoiceSequence, il.InvoiceLineItemAmount FROM Vendors AS v JOIN Invoices AS i ON (v.VendorID = i.VendorID) JOIN InvoiceLineItems AS il ON (i.InvoiceID = il.InvoiceID) WHERE i.InvoiceID IN (SELECT InvoiceSequence FROM InvoiceLineItems WHERE InvoiceSequence > 1) ORDER BY v.VendorName, i.InvoiceID, il.InvoiceSequence, il.InvoiceLineItemAmount
En spécifiant les noms de table ou en utilisant des alias , vous indiquez explicitement les colonnes auxquelles vous faites référence, résolvant ainsi l'ambiguïté et permettant à la requête de s'exécuter correctement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!