2016-10-11 11 views
0

IV00101SOP30300の2つのテーブルを結合しようとしています。 IV00101には、データベースに設定されているすべての部品番号が含まれています。SOP30300には、販売されるすべてのラインアイテムが含まれています。販売されている非在庫品(IV00101にはない)がある場合はSOP30300にあり、CSLSINDX =137を使用して取得できます。テーブルを結合する必要があるのは部品番号ですが、部品番号の有無にかかわらず、SOP30300からすべての行が必要ですテーブルを結合して、左からすべての行を取得し、一致しない行を含むすべての行を右に取得する

これは私の試みですが、いくつか不足していることがわかります私はIV00101テーブルを除外したときに、私は(参加1575ワット/ O IV00101; 1182参加/ W)以上の行が返さを得る

(SELECT 
     partTable.SOPNUMBE, 
     partTable.LNITMSEQ, 
     partTable.[Ship To Customer], 
     partTable.UNITCOST, 
     partTable.QUANTITY, 
     partTable.CSLSINDX, 
     cogsTable.ITEMNMBR, 
     cogsTable.ITMSHNAM 
     FROM 
      (SELECT 
       parts.ITEMNMBR, 
       parts.SOPNUMBE, 
       parts.LNITMSEQ, 
       parts.ShipToName, 
       parts.CNTCPRSN AS [Ship To Customer], 
       parts.UNITCOST, 
       parts.QUANTITY, 
       parts.CSLSINDX 
       FROM METRO.dbo.SOP30300 parts WHERE SOPNUMBE like 'I%' AND CSLSINDX = 137 
      ) partTable 

      LEFT JOIN 
       (SELECT 
        cogs.ITEMNMBR, 
        cogs.ITMSHNAM 
        FROM METRO.dbo.IV00101 cogs WHERE IVCOGSIX = 137 AND ITMSHNAM <> 'TM' AND ITMSHNAM <> 'Rebate' 
       )cogsTable 
       ON cogsTable.ITEMNMBR = partTable.ITEMNMBR 
    ) partNumbers 

から1182行

(SELECT 
    partTable.SOPNUMBE, 
    partTable.LNITMSEQ, 
    partTable.[Ship To Customer], 
    partTable.UNITCOST, 
    partTable.QUANTITY, 
    partTable.CSLSINDX, 
    partTable.ITEMNMBR 

    FROM 
      (SELECT 
       parts.ITEMNMBR, 
       parts.SOPNUMBE, 
       parts.LNITMSEQ, 
       parts.ShipToName, 
       parts.CNTCPRSN AS [Ship To Customer], 
       parts.UNITCOST, 
       parts.QUANTITY, 
       parts.CSLSINDX 
       FROM METRO.dbo.SOP30300 parts WHERE SOPNUMBE like 'I%' AND CSLSINDX = 137 
      ) partTable 
) partNumbers 

-Returns 1575行を返します。

誰かが私が誤って2つのテーブルにどのように参加しているか教えていただけますか?

+0

http://stackoverflow.com/questions/5706437/whats-the-difference-between-inner-join-left-join-right-join-and-full-join?rq=1 – Zack

+0

私は'SOP30300'の中に' IV00101'で_multiple_のマッチがある行があるので、より多くの行を取得します。 'cogsTable.ITEMNMBR'のaNull値は、一致するかどうかを示します。 –

+0

両方の表の間でCROSS JOINを探しているようです。 –

答えて

0

左が参加:

SELECT 
    parts.SOPNUMBE, 
    parts.LNITMSEQ, 
    parts.CNTCPRSN AS [Ship To Customer], 
    parts.UNITCOST, 
    parts.QUANTITY, 
    parts.CSLSINDX 
    cogs.ITEMNMBR, 
    cogs.ITMSHNAM 
FROM METRO.dbo.SOP30300 parts 
LEFT JOIN METRO.dbo.IV00101 cogs ON cogs.ITEMNMBR = parts.ITEMNMBR AND cogs.IVCOGSIX = 137 AND cogs.ITMSHNAM <> 'TM' AND cogs.ITMSHNAM <> 'Rebate' 
WHERE parts.SOPNUMBE like 'I%' AND parts.CSLSINDX = 137 

注意を、IV00101上の要件の数はそう、彼らは全体のクエリに登録しようとしませに対するフィルタされている参加のON部分である必要があります。それらをWHEREに入れれば、より少ない結果を返す内部結合を作成します。

内部結合になる理由は、NULLをフィルタリングできないため、通常は除外するコグ列に対してnullを取得する場合です。これは内部結合と同じです。

+0

あなたは 'ON'キーワードを含めるつもりでしたか? – Beth

+0

私は水平にスクロールしないようにしていました。あなたが「ON」を見逃したことに気付きました。 – Beth

+0

Thanks Hogan。それは間違いなく物事をクリアします。助けを感謝し、これをもう少し詳しく理解するためにこれをテストします。 – Adjit

関連する問題