SQL Server:使用元组IN子句

时间:2017-07-07 23:00:39

标签: sql sql-server

我正在尝试加入4个关系有些复杂的表格。因为它将被使用,它需要包含在单个查询中,但是我遇到了麻烦,因为主查询和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问题,但从来没有双方都需要加入。

1 个答案:

答案 0 :(得分: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 = (?)
             );