2012-09-30 7 views
19

このクエリ(InvoiceID)であいまいな列名エラーが発生します。なぜ私は理解できません。それらはすべて正しく結合されているように見えるため、管理スタジオはVendorIDを表示することをなぜ知っていませんか?どんな助けでも大歓迎です。SQL内のあいまいな列名でクエリエラーが発生しました

問合せ:

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 

答えて

29

私はあなたがInvoiceIDにあいまいさしかないと思います。他のフィールドは異なるようです。だから、この

は、私はちょうどあなたが任意のエイリアスを使用せずに(での選択では、どこで、でグループおよび順序)すべての列のtablename.columnnaeを使用することができます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 

でInvoiceIDを交換してみてください。しかし、別の答えによって導かれる別名を使用することができます

+0

はい、ありがとうございます。私は列名をInvoiceIDのままにしたいので、エイリアスを使いたくなかった。 – jaielob

+0

ようこそ。私はエイリアスを使いませんでした。エイリアスで便利ではないと感じました。 – Sami

+0

これは本当に私にとって役に立ちました。私はSQLに新しいです、今日新しい事を学びました。 :) – satwal

6

あなたはInvoices表にしてもInvoiceLineItemsテーブルの列InvoiceIDを持っています。クエリ実行エンジンは、どのクエリを返すかを知る方法はありません。表の別名を追加

は役立ちます:

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 
+1

ありがとうございます。 – jaielob

3

ほとんどの場合、両方のテーブルに同じ名前の列を持っています。各テーブルをエイリアスし、各エイリアスで各列を呼び出します。

3

フィールドの一部(請求書テーブル上及び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 
+0

私はあなたの答えを編集しようとしていましたが、私のことはあまりにも異なっていたので、私は編集の編集と投稿の回答を掲示しました。おそらく、少し遅れた。 「私はあなたからちょっとした指導をして欲しい」..何の理由でこの質問に投票が多いのか?私は次の時間に質問しながらそれに従うだろうと尋ねる。 – Sami

+1

@Samあなたの答えは私のものよりもはっきりとしています:) –

+0

@sami多分問題は明らかです。 OPには質問に関する十分な情報が含まれています.. –

4

InvoiceIDを含む2つの表InvoiceおよびInvoiceLineItemsを結合しているためです。 Invoices.InvoiceIDに変更して正しいものにします。

1

2つ以上の表を結合し、それらの列に似た名前を持つ場合、SQL Serverはそれらが属する列を修飾します。

SELECT ev.[ID] 
    ,[Description] 
    FROM [Events] as ev 
    LEFT JOIN [Units] as un ON ev.UnitID = un.UnitId 

イベントとUnitsテーブルがある場合は、同じ列名(ID)SQLサーバを使用すると、エイリアスを使用することを望んでいます。

関連する問題