2012-09-30 33 views
19

Aparece un error de nombre de columna ambiguo con esta consulta (InvoiceID). No puedo entender por qué. Todos parecen estar unidos correctamente, entonces ¿por qué el estudio de gestión no sabe mostrar VendorID? Cualquier ayuda sería muy apreciada.Error de consulta con nombre de columna ambiguo en SQL

Consulta:

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 

Respuesta

29

Creo que tiene ambigüedad solo en InvoiceID. Otros campos parecen distintos. Así que trate de este

Me basta con sustituir InvoiceID con Invoices.InvoiceID

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 

Puede utilizar tablename.columnnae para todas las columnas (en la selección, en donde, por grupo y el orden) sin utilizar ningún alias. Sin embargo, puede usar un alias según las otras respuestas

+0

Sí y gracias. No quería usar un alias porque quería que el nombre de la columna permaneciera InvoiceID. – jaielob

+0

De nada. No usé alias solo porque sentí que no te sientes cómodo con el alias – Sami

+0

. Esto realmente funcionó para mí. Soy nuevo en SQL, aprendí algo nuevo hoy. :) – satwal

6

tiene una columna en la tabla InvoiceIDInvoices y también en la tabla InvoiceLineItems. No hay forma de que el motor de ejecución de consultas sepa cuál devuelve.

Adición de un alias de la tabla le ayudará:

SELECT V.VendorName, I.InvoiceID, IL.InvoiceSequence, IL.InvoiceLineItemAmount 
FROM Vendors V 
JOIN Invoices I ON (...) 
JOIN InvoiceLineItems IL ON (...) 
WHERE ... 
ORDER BY V.VendorName, I.InvoiceID, IL.InvoiceSequence, IL.InvoiceLineItemAmount 
+1

Veo gracias. – jaielob

3

más probable es que ambas tablas tienen una columna con el mismo nombre. Alias ​​cada tabla, y llame a cada columna con el alias de la tabla.

3

es porque algunos de los campos (específicamente InvoiceID sobre la mesa Facturas y en las InvoiceLineItems) están presentes en ambos tabla. La forma de responder la pregunta es agregarle un ALIAS.

SELECT 
    a.VendorName, Invoices.InvoiceID, .. -- or use full tableName 
FROM Vendors a -- This is an `ALIAS` of table 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 
+0

Iba a editar su respuesta, pero la mía era demasiado diferente, así que publiqué la edición cancelada y la respuesta fue publicada. Era un poco tarde quizás. 'Quiero una pequeña guía de usted, por favor' .. ¿Por qué razón esta pregunta obtuvo tantos votos? Preguntar porque lo seguiría haciendo una pregunta la próxima vez. – Sami

+1

@Sami su respuesta es muy clara que la mía :) –

+0

@sami tal vez la pregunta es clara. y el OP incluye suficiente información con respecto a la pregunta .. –

4

Porque está uniendo dos tablas Invoices y InvoiceLineItems que contienen InvoiceID. cambie a Invoices.InvoiceID para hacerlo correcto.

1

si une 2 o más tablas y tienen nombres similares para sus columnas sql server quiere que califique las columnas a las que pertenecen.

SELECT ev.[ID] 
    ,[Description] 
    FROM [Events] as ev 
    LEFT JOIN [Units] as un ON ev.UnitID = un.UnitId 

si Eventos y mesas unidades tiene mismo nombre de columna (ID) del servidor SQL quiere que uses alias.

Cuestiones relacionadas