我的老板按照我的方式抛出了这段代码,我很难理解内部联接的最后一个ON语句是如何工作的。我不认为他完全理解它(但它完成了工作)。真的只是想了解更多关于SQL的工作原理。非常感谢你!
这是On Statement
and (A.Submitted_Date > X.Submitted_Date)))
这是查询
SELECT AA.ID, AA.Submitted_Date as Date_Status
FROM Report as AA
where AA.Submitted_Date in
--START
(
SELECT X.Submitted_Date
FROM Report as A
inner join
--Start Find All Dates Submitted
(
SELECT [ID],[Submitted_Date]
FROM Report
where not(Submitted_Date is null and Cleared_Date is null)
group by ID, Submitted_Date) as X
--End Find all Dates Submittd
--below is the conditions of the join
ON A.ID = X.ID
and A.ID= AA.ID
--THIS IS THE CONDITION I AM CONFUSED ABOUT!!!!
and (A.Submitted_Date > X.Submitted_Date)))
group by X.Submitted_Date)
and not AA.Submitted_Date is null
group by AA.ID, AA.Submitted_Date
以下是表A中的日期样本
2012-11-27 00:00:00.000
2012-11-27 00:00:00.000
2012-11-27 00:00:00.000
2012-12-10 00:00:00.000
2012-11-27 00:00:00.000
2012-11-27 00:00:00.000
2012-11-29 00:00:00.000
2012-12-05 00:00:00.000
2012-12-12 00:00:00.000
以下是表X中的日期样本
2012-11-27 00:00:00.000
2012-11-29 00:00:00.000
2012-12-05 00:00:00.000
2012-12-10 00:00:00.000
2012-12-12 00:00:00.000
这是最后一个条件之前的结果
2012-11-27 00:00:00.000
2012-11-29 00:00:00.000
2012-12-05 00:00:00.000
2012-12-10 00:00:00.000
2012-12-12 00:00:00.000
以下是A.Sub>的结果。 X.Sub
2012-11-27 00:00:00.000
2012-11-29 00:00:00.000
2012-12-05 00:00:00.000
2012-12-10 00:00:00.000
我很困惑为什么会出现这些日期。 A和X之间的比较是什么? A中的值不会始终与X相同,因此不会产生最终数据吗?谢谢你的帮助!
答案 0 :(得分:2)
连接条件正在做两件事。首先,确保x.Submitted_Date
不为空。这种直接与其正上方的whre
陈述相矛盾。在该语句中,如果Submitted_Date
不为空,Cleared_Date
可能为NULL。
只需使用非NULL检查即可。联接是内部联接,因此仅保留匹配的x
和a
中的行。当x.Submitted_Date is null
时,比较A.Submitted_Date > X.Submitted_Date
的计算结果为FALSE(实际上为NULL,但在此上下文中NULL等于FALSE)。
其次,确保给定Report
的{{1}}中有另一条以后的记录。这是通过相同的比较进行的:id
表示A.Submitted_Date > X.Submitted_Date
中的记录比A
更晚。除了最大值之外,X
的所有值都满足条件。
因此,简而言之,除了最新日期之外,条件是采用所有提交的日期值。
条件可能相当于:
Submitted_Date
我说可能因为where AA.Submitted_Date <> (select MAX(x.Submitted_Date) from Report where x.id = AA.id)
使这个问题变得可疑。但是,我认为它们是一样的。只要Cleared_Date
不为NULL,就满足原始查询中的where
子句。清除日期可能会带来额外的行,但这些行将具有null提交日期。因此,除了最大的提交日期之外,它正在拉动。
我猜这个逻辑曾经更复杂,这是一个可以进一步简化的“简化”版本。
答案 1 :(得分:2)
如果您的数据包含ID字段会更好。我认为ID不是唯一的。此外,我怀疑你选择的样本并不是理解情况的理想选择。
考虑到你的问题的这些限制,我认为让你感到困惑的是条件A.ID = X.ID.这使你认为日期是相同的,因此应该没有数据。
如果您的报告表包含:
1 2012-11-27
1 2012-11-29
然后交叉连接创建:
1 2012-11-27 1 2012-11-27
1 2012-11-27 1 2012-11-29
1 2012-11-29 1 2012-11-27
1 2012-11-29 1 2012-11-29
通过标准A.ID = X.ID然后A.date&gt; X.date将返回
1 2012-11-29 1 2012-11-27
编辑:删除“记录2012-11-27不应该是基于样本的结果的一部分。”因为所采用的日期字段来自X,而不是来自A.