4

我的老板把这段代码扔给我了,我很难理解内部连接的最后一个 ON 语句是如何工作的。我认为他也不完全理解它(但它完成了工作)。真的只是对了解有关 SQL 工作原理的更多信息感兴趣。非常感谢!

这是 On 声明

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 相同,因此没有最终数据?感谢您的帮助!

4

2 回答 2

2

加入条件正在做两件事。首先,它确保它x.Submitted_Date不为空。这种直接与whre上面的陈述相矛盾。在该语句中,Submitted_Date如果不为空,则可能为 NULL Cleared_Date

对 not NULL 的检查只是被使用。联接是内部联接,因此仅x保留a匹配的行。当 时x.Submitted_Date is null,比较结果A.Submitted_Date > X.Submitted_Date为 FALSE(实际上为 NULL,但在此上下文中 NULL 等效于 FALSE)。

其次,它确保稍后对于Report给定的id. 这是通过相同的比较发生的: A.Submitted_Date > X.Submitted_Date表示在Athan中有一个较晚的记录X。条件对 的所有值都为真Submitted_Date,最大值除外。

因此,简而言之,条件是采用除最新日期之外的所有提交的日期值。

条件可能等同于:

where AA.Submitted_Date <> (select MAX(x.Submitted_Date) from Report where x.id = AA.id)

我说可能是因为这Cleared_Date让人怀疑。但是,我认为它们是相同的。只要不为 NULL,where就会满足原始查询中的子句。x.Submitted_Date清除日期可能会带来额外的行,但这些行的提交日期为空。所以,除了最大的提交日期外,它正在拉所有的东西。

我猜这个逻辑再一次复杂了,这是一个“简化”的版本,可以进一步简化。

于 2013-03-28T18:00:51.140 回答
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 > X.date 将返回

1 2012-11-29 1 2012-11-27

编辑:删除“根据样本,记录 2012-11-27 不应该是结果的一部分。” 因为正在获取的日期字段来自 X,而不是来自 A。

于 2013-03-28T18:06:09.333 回答