2016-10-14 1 views
0

私はわずか5時間か6時間のSQL初心者です。私は速く勉強しています。"3つのテーブルを結合しようとすると、マルチパート識別子 'xxx'をバインドできませんでした。

最終的には、製品ラインごとにクライアントのアドレスを選択しようとしています。最初のテーブル(arinvch)には請求書が含まれているため、クライアントのアドレスが含まれています。 2番目のテーブル(aritrsh)にはテーブル1の請求書の個別明細が含まれ、3番目のテーブル(icitemh)には明細の製品明細が含まれます。

最初にサブクエリでテーブル2と3を結合しようとしましたが、最初に製品ラインを抽出し、最初のテーブルと結合して製品ラインごとに顧客アドレスを取得しました。簡単に言えば

、これは私が何をしようとしたものです:

SELECT 
    table1.addressinfo 
FROM 
    table1 
INNER JOIN 
    (SELECT * FROM 
    table2 INNER JOIN table3 
    ON table2.itemnumber = table3.itemnumber 
    WHERE table3.type = 'CRM') joinedtable 
ON 
    table1.customernumber = joinedtable.customernumber; 

正確なコード:

SELECT 
    arinvch.ccustno AS [Customer #], 
    arinvch.dinvoice AS [Invoice Date], 
    arinvch.cbcompany AS [Bill to Company], 
    arinvch.cbaddr1 AS [Bill to Address 1], 
    arinvch.cbaddr2 AS [Bill to Address 2], 
    arinvch.cbcity AS [Bill to City], 
    arinvch.cbstate AS [Bill to State], 
    arinvch.cbzip AS [Bill to Zip Code], 
    arinvch.cbcountry AS [Bill to Country], 
    arinvch.cbphone AS [Bill to Phone], 
    arinvch.cscompany AS [Ship To Company], 
    arinvch.csaddr1 AS [Ship To Address 1], 
    arinvch.csaddr2 AS [Ship To Address 2], 
    arinvch.cscity AS [Ship To City], 
    arinvch.csstate AS [Ship To State], 
    arinvch.cszip AS [Ship To Zip Code], 
    arinvch.cscountry AS [Ship To Country], 
    arinvch.csphone AS [Ship To Phone], 
    arinvch.cscontact AS [Ship To Contact], 
    aritrsh.cinvno AS [Invoice #], 
    aritrsh.citemno AS [Item Number], 
    icitemh.citemno AS [Item #] 
FROM 
    arinvch 
    INNER JOIN 
    (SELECT 
    aritrsh.clineitem 
    FROM 
    aritrsh 
    INNER JOIN 
    icitemh 
    ON 
    aritrsh.citemno = icitemh.citemno 
    WHERE icitemh.ctype = 'CRM')table2 
ON 
    arinvch.ccustno = aritrsh.ccustno; 

これは(FlySpeed SQLで)次のエラーメッセージを返します。

[ FireDAC] [Phys] [ODBC] [Microsoft] [ODBC SQL Server Driver] [SQL Server] マルチパート識別子 "aritrsh.ccustno"はバインドできませんでした。

ありがとうございます! (また、副目標として、私はそれらが素晴らしいであろう請求書からそれらを引き出すときに私が繰り返しないアドレスを得ることができる方法を説明することができます。)私は多くの場所でSELECT DISTINCTを取り入れようとしましたが、 (私はtable1.customernumberがはっきりとWHERE DISTINCTものではありませんようにしたいと)ソリューションを仕事にする。)

答えて

0
arinvch 
    JOIN ( 
     SELECT aritrsh.clineitem 
     FROM aritrsh 
      JOIN icitemh ON 
       aritrsh.citemno = icitemh.citemno 
     WHERE icitemh.ctype = 'CRM' 
     ) table2 ON 
     arinvch.ccustno = aritrsh.ccustno; 

2番目の表は、あなたの例では表2で、aritrshありません。第二部のために

: arinvch(1:M) - > aritrshと aritrsh(1:1) - > icitemh

aritrshは、顧客が注文した1以上の製品を持つことになります。これにより、注文された各製品のアドレス欄が繰り返されます。 select文全体をカッコで囲み、group byを使用して請求書レコードを削除することで、全体を要約することができます。 。aritrshのような接頭辞なしの内側のSELECTであなたの項目の名前を、B、C、Dを交換してください(。ただ明確なように)重複を削除、だけ持つフィールドを持つことになりますことで

select a, b, c, d 
from (big select statement above) A 
group by a, b, c, d 

グループに請求書行ではなく、住所と製品との関連付け。

+0

ここで間違いを修正し、aritrsh.ccustnoをtable2.ccustnoに置き換えました。残念ながら、次のエラーが発生しました。[FireDAC] [Phys] [ODBC] [Microsoft] [SQL Serverネイティブクライアント10.0] [SQL Server]無効な列名 'ccustno'。 –

+0

私はccustnoが確かにarinvchとaritrshに存在するSQLサーバのカラム名であることを保証することができます。 –

0

あなたはサブクエリを必要はありません。

FROM arinvch INNER JOIN 
    aritrsh 
    ON arinvch.ccustno = aritrsh.ccustno INNER JOIN 
    icitemh 
    ON aritrsh.citemno = icitemh.citemno AND icitemh.ctype = 'CRM' 

ロジックは、サブクエリなしで理解することは簡単です。クエリのテーブルエイリアスを使用します。

FROM arinvch n INNER JOIN 
    aritrsh t 
    ON n.ccustno = t.ccustno INNER JOIN 
    icitemh i 
    ON t.citemno = i.citemno AND i.ctype = 'CRM' 

これにより、クエリの書き込みと読み込みが簡単になります。

+0

これを試してみてください。うまくいきませんでした。コードの実行時にエラーは表示されませんでしたが、レコードは表示されませんでした。理由は何ですか? –

+0

1つの結合から開始し、さらに追加します。明らかに、テーブルのデータが一致しません。 –

関連する問題