2017-07-07 19 views
1

多少複雑な関係にある4つのテーブルを結合しようとしています。このため、1つのクエリに含まれる必要がありますが、プライマリクエリとIN句クエリは両方とも2つのテーブルを結合し、ルックアップは2つの列にあるため、問題があります。SQL Server:タプルIN句のマルチジョイン

目標は、入力にSalesNumSalesTypeであり、それはPrice

テーブルとの関係を返すがあります。

sdShipping

SalesNum[1] 
SalesType[2] 
Weight[3] 

sdSales

を10

spZones

Zip[4] 
Zone[5] 

spPrices

Zone[5] 
Price 
Weight[3] 

は、ここでT-SQLでの私の最新の試みです:

SELECT 
    spp.Price 
FROM 
    spZones AS spz 
LEFT OUTER JOIN 
    spPrices AS spp ON spz.Zone = spp.Zone 
WHERE 
    (spp.Weight, spz.Zip) IN (SELECT ship.Weight, sales.Zip 
           FROM sdShipping AS ship 
           LEFT OUTER JOIN sdSales AS sales ON sales.SalesNum = ship.SalesNum 
                   AND sales.SalesType = ship.SalesType 
           WHERE sales.SalesNum = (?) 
           AND ship.SalesType = (?)); 

SQL Server Management Studioのは、私がエラーを持っていると言います'、'の近くに私の構文(適切に役に立たないエラーメッセージ)。これはMicrosoftのSQLバージョンでも許可されているのかどうかは誰にも分かりますか?おそらくそれを達成する別の方法はありますか?私はここで答えた複数のキーの質問を見てきましたが、両方の側でJOINが必要な場合は決してありません。

答えて

1

多くのデータベースはタプルにINをサポートしています。 SQL Serverはその1つではありません。

使用EXISTS代わり:

SELECT spp.Price 
FROM spZones spz LEFT OUTER JOIN 
    spPrices spp 
    ON spz.Zone = spp.Zone 
WHERE EXISTS (SELECT 1 
       FROM sdShipping ship LEFT JOIN 
        sdSales sales 
        ON sales.SalesNum = ship.SalesNum AND 
         sales.SalesType = ship.SalesType 
       WHERE spp.Weight = ship.Weight AND spz.Zip = sales.Zip AND 
        sales.SalesNum = (?) AND 
        ship.SalesType = (?) 
      ); 
+0

あなたは天才ゴードンだ - それは本当に便利です、ありがとう!私はまだ何の結果も得ていませんが、少なくともそれは私にもうエラーを与えていません...そのIN節で時間を無駄にすることはもうありません。私は価格が – Typel

+0

@Typelになるためにまだ欠けているものが何であるかを知ることができるとすぐに、クレジットを与えます。 。 。あなたの質問はかなり複雑です。 1つの可能性は、ウェイトが一致しないことです。これは、より多くの範囲になる数字のように見えます。 –

+0

良いコール、私はある時点でそこに重量のCEILINGを使用していたが、いくつかの誤った試行後にそれを落とそうとしている必要があります。また、SalesNumとSalesTypeでRTRIMを試行すると、末尾に空白文字があることがあります。まだ何もありませんが、私はそれが近いと感じています。 – Typel