2017-07-07 72 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