Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 限制联接结果_Sql_Join - Fatal编程技术网

Sql 限制联接结果

Sql 限制联接结果,sql,join,Sql,Join,我为这个模糊的问题道歉,如果以前有人问过这个问题,我很难清楚地表达这个问题 我有三张桌子;批次和销售订单,以及订单批次: 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 -------

我为这个模糊的问题道歉,如果以前有人问过这个问题,我很难清楚地表达这个问题

我有三张桌子;批次和销售订单,以及订单批次:

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批次是在这个日期创建的,它们用于“填充”SalesOrderID 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'


我发现第二个选项中的
IN()
条件稍微容易理解,但我倾向于在可能的情况下使用
JOIN
,因为根据我的经验,它的性能会更好一些,更容易适应更复杂的情况。和往常一样,如果性能如此重要,您应该实际分析查询并查看执行计划。优化器总是会让您大吃一惊。

您尝试的查询将有助于了解需要更正的内容,因此salesOrderID1的总收入为500,而您不知道按批次存在哪些收入?正确。实际问题是:给定一个生产日期,我产生了多少收入。订单上“装满”了很多。因此,我需要获得在给定日期生产的所有订单的收入。我考虑使用distinct进行子查询,但由于某些原因,这似乎不正确。我不知道为什么我会在意(这只是我正在写的一个小工具),但我认为可能有一种方法可以避免使用“独特的”。你可以总是使用“分组方式”。
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
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
)