2017-07-07 119 views
1

我試圖連接4個具有複雜關係的表。由於這將用於何處,因此需要將其包含在單個查詢中,但由於主查詢和IN子句查詢都將2個表連接在一起,並且查找在兩列上,所以我遇到了麻煩。SQL Server:使用元組IN多重連接IN子句

的目標是輸入SalesNumSalesType並讓它返回Price

表和關係:

sdShipping

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

sdSales

SalesNum[1] 
SalesType[2] 
Zip[4] 

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中說,我有一個錯誤我的語法靠近','(恰當無用的錯誤 信息)。任何人都不知道這是否甚至允許在微軟的SQL版本中使用?也許還有另一種方法來完成它?我在這裏看到了多鍵IN問題,但從來沒有在雙方都需要JOIN的情況下回答。

回答

1

許多數據庫支持元組上的IN。 SQL Server不是其中之一。

使用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

你是一個天才戈登 - 這是真正有用的,謝謝!我仍然沒有得到任何結果,但至少它不再給我一個錯誤了......再也不用浪費時間了。我會盡快找出遺漏的東西,以便得到Price – Typel

+0

@Typel。 。 。您的查詢相當複雜。一種可能性是權重不匹配 - 這看起來像一個數字,可能更多的是一個範圍。 –

+0

良好的呼叫,我一直在那裏一直在使用CEILING來減肥,但是在嘗試幾次失誤之後,必須嘗試減肥。還要在SalesNum和SalesType上嘗試RTRIM,因爲最後偶爾會有空白字符。沒有什麼,但我覺得它接近... – Typel