SQL Server子查询基于另一个子查询不返回任何内容
我有两个子查询,其中基于第一个子查询,第二个子查询的结果发生了我不希望发生的变化 这两个查询完全相同,不同于它们用于日期的变量 第一个查询始终正常工作,但第二个查询有时似乎会受到第一个查询的影响 如果在第二个查询之前有第一个查询,那么它们都将返回相同的日期。如果在第一个查询之前有第二个查询,那么它有时什么也不返回SQL Server子查询基于另一个子查询不返回任何内容,sql,sql-server,subquery,ssrs-2012,Sql,Sql Server,Subquery,Ssrs 2012,我有两个子查询,其中基于第一个子查询,第二个子查询的结果发生了我不希望发生的变化 这两个查询完全相同,不同于它们用于日期的变量 第一个查询始终正常工作,但第二个查询有时似乎会受到第一个查询的影响 如果在第二个查询之前有第一个查询,那么它们都将返回相同的日期。如果在第一个查询之前有第二个查询,那么它有时什么也不返回 declare @curDate date = DATEADD(week,0,'2016/02/01') declare @shortDate date = DATEADD(week,
declare @curDate date = DATEADD(week,0,'2016/02/01')
declare @shortDate date = DATEADD(week,-2,@curDate)
SELECT -- Select Columns
quere1.Location,
quere1.Product,
quere1.Short,
MAX( quere1.Date ) [Date],
MAX( quere1.Volume ) [Volume],
MAX( quere1.Cost ) [Cost],
MAX( quere2.Date ) [DateAgo],
MAX( quere2.Volume ) [VolumeAgo],
MAX( quere2.Cost ) [CostAgo]
FROM
(SELECT --subQuery 1
cst_mac_a.loc [Location], --Branch
cst_mac_a.product [Product], --Product
pro_duct.desc4 [Short],
MAX( cst_mac_a.datecreated ) [Date], --Date
MAX( cst_mac_a.ohvol ) [Volume], --Volume
MAX( cst_mac_a.ohextcost ) [Cost] --Cost
FROM cst_mac as cst_mac_a
JOIN pro_type ON pro_type.proType = cst_mac_a.proType
JOIN pro_duct ON pro_duct.proType = cst_mac_a.proType AND pro_duct.product = cst_mac_a.product
WHERE
cst_mac_a.protype = 'HW' AND
cst_mac_a.datecreated in (SELECT MAX( sub.datecreated ) from cst_mac as sub WHERE
cst_mac_a.product = sub.product AND sub.datecreated <= @curDate) AND
cst_mac_a.timecreated in (SELECT MAX( sub.timecreated ) from cst_mac as sub WHERE
cst_mac_a.product = sub.product AND sub.datecreated in
(SELECT MAX( sub2.datecreated ) from cst_mac as sub2 WHERE
sub2.datecreated <= @curDate and sub2.product = sub.product)) AND
cst_mac_a.PROGRESS_RECID in (SELECT MAX( sub.PROGRESS_RECID ) from cst_mac as sub WHERE
cst_mac_a.product = sub.product AND sub.datecreated in
(SELECT MAX( sub2.datecreated ) from cst_mac as sub2 WHERE
sub2.datecreated <= @curDate AND sub2.product = sub.product)) AND
cst_mac_a.ohvol <> 0 AND
cst_mac_a.product = 'A4ROUP'
GROUP BY
cst_mac_a.loc,
cst_mac_a.product,
pro_duct.desc4)
as quere1
LEFT OUTER JOIN (SELECT --Basically same code, subquery 2
cst_mac_a2.loc [Location], --Branch
cst_mac_a2.product [Product], --Product
pro_duct.desc4 [Short],
MAX( cst_mac_a2.datecreated ) [Date], --Date
MAX( cst_mac_a2.ohvol ) [Volume], --Volume
MAX( cst_mac_a2.ohextcost ) [Cost] --Cost
FROM cst_mac as cst_mac_a2
JOIN pro_type ON pro_type.proType = cst_mac_a2.proType
JOIN pro_duct ON pro_duct.proType = cst_mac_a2.proType AND pro_duct.product = cst_mac_a2.product
WHERE
cst_mac_a2.protype = 'HW' AND
cst_mac_a2.datecreated in (SELECT MAX( sub3.datecreated ) from cst_mac as sub3 WHERE
cst_mac_a2.product = sub3.product AND sub3.datecreated <= @shortDate) AND
cst_mac_a2.timecreated in (SELECT MAX( sub3.timecreated ) from cst_mac as sub3 WHERE
cst_mac_a2.product = sub3.product AND sub3.datecreated in
(SELECT MAX( sub4.datecreated ) from cst_mac as sub4 WHERE
sub4.datecreated <= @shortDate and sub4.product = sub3.product)) AND
cst_mac_a2.PROGRESS_RECID in (SELECT MAX( sub3.PROGRESS_RECID ) from cst_mac as sub3 WHERE
cst_mac_a2.product = sub3.product AND sub3.datecreated in
(SELECT MAX( sub4.datecreated ) from cst_mac as sub4 WHERE
sub4.datecreated <= @shortDate AND sub4.product = sub3.product))
GROUP BY
cst_mac_a2.loc,
cst_mac_a2.product,
pro_duct.desc4)
as quere2
ON quere1.Product = quere2.Product AND quere1.Location = quere2.Location
GROUP BY
quere1.Location,
quere1.Product,
quere1.Short
Order BY
quere1.Location,
quere1.Product,
quere1.Short
这就是LEFT JOIN的工作方式。它从第一个查询中获取所有行,但从第二个查询中仅获取匹配行(根据ON子句中的连接条件)
如果您希望始终从两个查询中获取所有行,即使在相反的查询中没有匹配的行,也需要使用完整的外部联接。如果我在第一个查询的where中添加行:cst_mac_a.product='a4group',它将返回一行(因此我们不必担心LEFT/JOIN)。如果我在0周前进行第一次查询,在2周前进行第二次查询,则第二次查询不返回任何内容(空白)。当第一次查询为-1周前,第二次查询为2周前时,第二次查询返回正确的结果,但第一次查询提前了1周。如果不知道您的数据是什么,我无法知道您为什么会看到所看到的结果。如果我的答案不能解决您的问题,您需要编辑您的问题并添加以下详细信息:示例数据、当前查询的结果、您尝试获取的结果。我添加了一些输出。这是一个奇怪的问题,第二个查询的输出在第一个查询的基础上发生了变化,但我知道数据在那里。您希望看到但没有看到的表中某些数据的示例是什么?在我的示例输出中,它显示了DataAgo、VolumeAgo和CostAgo的信息,这正是我想要看到的。但我只在curDate为1周前(从2016年2月1日起)时看到此数据,我想将当前数据与2周前的数据进行比较。如您所见,数据存在于此处(日期为2016年1月18日),但第一次查询(日期为2016年2月1日)将第二次查询(日期为2周前)弄乱(显示的是第一个示例,未显示任何数据)。基本上,它没有找到本例中显示的数据。
curDate = Today
shortDate = 2 weeks ago:
Location | Product | Short | Date | Volume | Cost | DateAgo | VolumeAgo | CostAgo
Mill | A4ROUP | BN. | 2/1/2016|40 | 36 | | |
curDate = 1 week ago
shortDate = 2 weeks ago
Location | Product | Short | Date | Volume | Cost | DateAgo | VolumeAgo | CostAgo
Mill | A4ROUP | BN. |1/25/2016|27 | 25 |1/18/2016| 29 | 26