限制联接结果

时间:2017-04-21 18:33:57

标签: sql join

对于模糊的问题道歉,如果以前曾经问过这个问题,我很难搞清楚这个问题。

我有三张桌子; Lot和Salesorder以及OrderLot:

Lot      SKU   CreationDate
-------------------------
1000-a   1000  2017-04-12
1000-b   1000  2017-04-13
2000-a   2000  2017-04-12
2000-b   2000  2017-04-13

SalesorderID   Revenue
-----------------------------
1              $500
2              $250
3              $125


OrderLotID   SalesorderID Lot
------------------------------
1             1           1000-a
2             1           2000-a
3             2           1000-b
4             2           2000-b
5             3           1000-a

我想进行一次加入,这给了我在SalesOrder中批次创建日期产生的总收入。

例如,我想使用2017-04-12的CreationDate并获得$ 625的结果(在此日期创建了1000-a和2000-a,并且他们已经习惯了&# 34;填写" SalesorderIDs 1和3)。但我目前使用的联接在Salesorder 1中返回两行,而Salesorder 3则返回一行,结果是1125美元。

如何限制从OrderLot返回的行,以便只计算唯一的Salesorder收入?

谢谢,

杰夫

修改。当前查询是:

select sum(so.revenue)
from salesorder so
inner join orderlot ol on so.lot = ol.lot
inner join lot l on ol.lot = l.lot
where l.creationdate = '2017-04-12'

1 个答案:

答案 0 :(得分:1)

SELECT SUM(s.Revenue)
FROM SalesOrder s
INNER JOIN (
    SELECT DISTINCT SalesOrderID
    FROM Lot l
    INNER JOIN OrderLot ol on ol.Lot = l.Lot
    WHERE l.CreationDate = @CreationDate
) t ON T.SalesOrderID = s.SalesOrderID

OR

SELECT SUM(s.Revenue)
FROM SalesOrder s
WHERE s.SalesOrderID IN (
    SELECT DISTINCT SalesOrderID
    FROM Lot l
    INNER JOIN OrderLot ol on ol.Lot = l.Lot
    WHERE l.CreationDate = @CreationDate
)

我发现IN()条件的第二个选项稍微容易理解,但我倾向于尽可能倾向于JOIN,因为它往往会在我的经验中表现更好一些,并且更容易适应更复杂的东西。和往常一样,如果性能非常重要,您应该实际分析查询并查看执行计划。优化器总能给你带来惊喜。