Ошибка запроса с неоднозначным именем столбца в SQL
Я получаю неоднозначную ошибку имени столбца с этим запросом (InvoiceID). Я не могу понять, почему. Кажется, что все они подключены правильно, так почему же не знает, что для управляющей студии для отображения VendorID? Любая помощь будет принята с благодарностью.
Query:
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
Ответы
Ответ 1
Я думаю, что у вас двусмысленность только в InvoiceID. Другие поля кажутся разными. Поэтому попробуйте
Я просто заменю InvoiceID на 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
Вы можете использовать tablename.columnnae для всех столбцов (в выборе, где, по группам и по порядку) без использования псевдонима. Однако вы можете использовать псевдоним, руководствуясь другими ответами.
Ответ 2
У вас есть столбец InvoiceID
в таблице Invoices
, а также в таблице InvoiceLineItems
. Механизм выполнения запроса не знает, какой из них вы хотите вернуть.
Добавление псевдонима таблицы поможет:
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
Ответ 3
Поскольку вы соединяете две таблицы Invoices и InvoiceLineItems, которые содержат InvoiceID. измените на Invoices.InvoiceID, чтобы сделать его правильным.
Ответ 4
Скорее всего, обе таблицы имеют столбец с тем же именем. Псевдоним каждой таблицы и вызовите каждый столбец с псевдонимом таблицы.
Ответ 5
потому что некоторые из полей (в частности, InvoiceID в таблице Invoices и на InvoiceLineItems) присутствуют на обеих таблицах. Способ ответа на вопрос состоит в том, чтобы добавить на него 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
Ответ 6
если вы присоединитесь к 2 или более таблицам и у них есть похожие имена для своих столбцов, сервер sql хочет, чтобы вы соответствовали столбцам, к которым они принадлежат.
SELECT ev.[ID]
,[Description]
FROM [Events] as ev
LEFT JOIN [Units] as un ON ev.UnitID = un.UnitId
если таблицы Events и Units имеют одинаковое имя столбца (ID) SQL-сервер, вы хотите использовать псевдонимы.
Ответ 7
Одна из ваших таблиц имеет такое же имя столбца, что приводит к путанице в запросе относительно того, на какие столбцы таблиц вы ссылаетесь. Скопируйте этот код и запустите его.
SELECT
v.VendorName, i.InvoiceID, iL.InvoiceSequence, iL.InvoiceLineItemAmount
FROM Vendors AS v
JOIN Invoices AS i ON (v.VendorID = .VendorID)
JOIN InvoiceLineItems AS iL ON (i.InvoiceID = iL.InvoiceID)
WHERE
I.InvoiceID IN
(SELECT iL.InvoiceSequence
FROM InvoiceLineItems
WHERE iL.InvoiceSequence > 1)
ORDER BY
V.VendorName, i.InvoiceID, iL.InvoiceSequence, iL.InvoiceLineItemAmount
Ответ 8
Это происходит потому, что в запросе есть поля с одинаковыми именами в нескольких таблицах из-за объединений, поэтому вы должны ссылаться на поля по-разному, давая имена (псевдонимы) таблицам.