1. ホーム
  2. sql

[解決済み] SQLのカラム名があいまいな場合のクエリエラー

2022-03-13 20:57:54

質問

このクエリ(InvoiceID)でambiguous column name errorが発生します。なぜなのかがわかりません。すべて正しく結合されているように見えますが、なぜ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

解決方法は?

からデータを選択するときにこのエラーに直面します。 複数のテーブル テーブルを結合して 選択されたカラムの少なくとも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を使用することができます。しかし、あなたは他の答えによって導かれるように、エイリアスを使用することができます。