[英]Query error with ambiguous column name in SQL
此查詢 (InvoiceID) 出現不明確的列名錯誤。 我不知道為什么。 它們似乎都已正確連接,那么為什么 SSMS 不知道顯示 VendorID?
詢問:
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
當我們通過連接表從多個表中選擇數據時,我們會遇到此錯誤,並且至少一個選定的列(使用 * 選擇所有列時也會發生這種情況)在多個表(我們選擇的)中存在同名/joined 表)。 在這種情況下,我們必須指定從哪個表中選擇列。
以下是上述概念的示例解決方案實現
我認為您只有在InvoiceLineItems
和Invoices
都存在的InvoiceID
中存在歧義 其他字段似乎不同。 所以試試這個
我只是用 Invoices.InvoiceID 替換 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 用於所有列(in selection、where、group by 和 order by),而無需使用任何別名。 但是,您可以按照其他答案的指導使用別名
你有一列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
因為您要聯接兩個都包含 InvoiceID 的表 Invoices 和 InvoiceLineItems。 更改為 Invoices.InvoiceID 以使其正確。
很可能兩個表都有一個同名的列。 給每個表取別名,並用表別名調用每一列。
這是因為一些領域都存在兩個表上(特別是在發票表,並在InvoiceLineItems InvoiceID)。 回答問題的方法是在其上添加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
如果您連接 2 個或多個表,並且它們的列名稱相似,則 SQL Server 希望您限定它們所屬的列。
SELECT ev.[ID]
,[Description]
FROM [Events] as ev
LEFT JOIN [Units] as un ON ev.UnitID = un.UnitId
如果 Events 和 Units 表具有相同的列名 (ID),SQL 服務器希望您使用別名。
它不僅僅發生在帶有連接的查詢中。
當您在單個表查詢上使用 ORDER BY 且列名在查詢中出現兩次時,可能會發生這種情況。
例如。
SELECT firstname, * FROM person ORDER BY firstname;`
因為firstname
在結果集中出現了兩次,所以您要按哪個排序是不明確的(即使它們都是相同的)。
您可以使用這些別名中的任何一個來解決它
SELECT firstname AS fn, * FROM person ORDER BY firstname;
SELECT p.firstname, * FROM person p ORDER BY firstname;
-- Its not really clear to me why this next one works but it does
SELECT p.firstname, p.* FROM person p ORDER BY p.firstname;
您的一個表具有相同的列名,這會在查詢中混淆您所指的表的哪些列。 復制此代碼並運行它。
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
發生這種情況是因為在查詢中存在多個表中的同名字段,由於連接,因此您應該以不同方式引用這些字段,為表指定名稱(別名)。
有時您可能希望在 SQL 中連接兩個表,並且表中有同名的列。
模棱兩可的錯誤意味着您正在調用 Table 中存在的某個字段,並且 SQL 不知道從哪里獲取它。 表 1 有一個字段(列)名稱“ID” 表 2 也有一個字段(列)名稱“ID”
例子
SELECT [ID],[Name],[GenderId] FROM [dbo].[TblPerson] AS A
INNER JOIN [dbo].[TblPerson] AS B
ON A.ID=B.GenderId;
查詢必須是
SELECT A.[ID],A.[Name],A.[GenderId] FROM [dbo].[TblPerson] AS A
INNER JOIN [dbo].[TblPerson] AS B
ON A.ID=B.GenderId;
它輸出(錯誤)不明確的列名,因為它對從何處獲取數據感到困惑,因為您可能在兩個不同的表或數據集中具有相同的查詢名稱“InvoiceID”(檢查您在 where 子句中使用的所有表,InvoiceID 應該是至少有兩個)。 要更正此類錯誤,您應該始終指定查詢及其表。 由於您要從供應商那里提取此數據,請將其指定為“vendors.InvoiceID”。 對於所有其他查詢,即使它沒有給您錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.