簡體   English   中英

SQL 中列名不明確的查詢錯誤

[英]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 表)。 在這種情況下,我們必須指定從哪個表中選擇列。

以下是上述概念的示例解決方案實現

我認為您只有在InvoiceLineItemsInvoices都存在的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),而無需使用任何別名。 但是,您可以按照其他答案的指導使用別名

你有一列InvoiceIDInvoices表,並在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM