>,<,<>,=内部连接条件的运算符

时间:2013-03-28 17:27:07

标签: mysql sql sql-server-2008 subquery inner-join

我的老板按照我的方式抛出了这段代码,我很难理解内部联接的最后一个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相同,因此不会产生最终数据吗?谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

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

只需使用非NULL检查即可。联接是内部联接,因此仅保留匹配的xa中的行。当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.