45

このクエリ (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
4

9 に答える 9

62

このエラーは、テーブルを結合して複数のテーブルからデータを選択し、選択した列の少なくとも 1 つ(* を使用してすべての列を選択した場合にも発生します)が複数のテーブル(選択したテーブル) に同じ名前で存在する場合に発生します。 /結合されたテーブル)。その場合、どのテーブルから列を選択するかを指定する必要があります。

以下は、上記で説明した概念のソリューション実装の例です

と他の分野のInvoiceID両方が存在するという点だけが曖昧だと思います。だからこれを試してくださいInvoiceLineItemsInvoices

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

エイリアスを使用せずに、すべての列 (selection、where、group by、および order by) に tablename.columnnae を使用できます。ただし、他の回答に従ってエイリアスを使用できます

于 2012-09-30T16:45:36.570 に答える
9

テーブルとテーブルに列InvoiceIDがあります。クエリ実行エンジンが、どれを返したいかを知る方法はありません。InvoicesInvoiceLineItems

テーブルエイリアスを追加すると、次のようになります。

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
于 2012-09-30T16:38:36.840 に答える
6

両方にInvoiceIDを含む2つのテーブルInvoicesとInvoiceLineItemsを結合しているためです。Invoices.InvoiceIDに変更して、正しくします。

于 2012-09-30T16:40:49.673 に答える
4

ほとんどの場合、両方のテーブルに同じ名前の列があります。各テーブルにエイリアスを作成し、テーブルエイリアスを使用して各列を呼び出します。

于 2012-09-30T16:39:05.250 に答える
4

これは、一部のフィールド(具体的には、Invoicesテーブルと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
于 2012-09-30T16:39:48.687 に答える