【问题标题】:>, <, <>, = Operators for Inner Join Conditions>、<、<>、= 内连接条件的运算符
【发布时间】:2013-03-19 06:34:41
【问题描述】:

我的老板把这段代码扔给我了,我很难理解内部连接的最后一个 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 相同,因此没有最终数据?感谢您的帮助!

【问题讨论】:

  • 我认为我们需要更多地了解您的报告表才能完全回答这个问题。您能否更新您的问题,以便 X 和 A 中的示例数据也具有 Report.ID。我知道正在发生的事情,但我不能说没有看到 ID,因为它们是连接条件的一部分。
  • 结果数据来自一个id。所以认为这个结果集在底部有一个 where 语句 where id = '111';感谢您的帮助!
  • 恕我直言,如果这个条件在 WHERE 子句中会更清楚。但是,我不确定执行计划是否相同。

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


【解决方案1】:

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

not NULL 的检查只是被使用。联接是内部联接,因此仅保留 xa 中匹配的行。当x.Submitted_Date is null 时,比较A.Submitted_Date &gt; X.Submitted_Date 计算结果为 FALSE(实际上是 NULL,但在这种情况下 NULL 等价于 FALSE)。

其次,它确保对于给定的idReport 中有另一条记录稍后。这是通过相同的比较发生的:A.Submitted_Date &gt; 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 使这变得可疑。但是,我认为它们是相同的。只要x.Submitted_Date 不为NULL,就会满足原始查询中的where 子句。清除日期可能会带来额外的行,但这些行的提交日期为空。因此,除了最大的提交日期之外,它正在拉取所有日期。

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

【讨论】:

  • 感谢您的回复戈登。您能否详细说明它是如何检查以后是否有记录的?以及如何确保 x.submitted_date 不为空?我觉得我开始有了更好的理解!
  • 我明白它是如何摆脱最后一条记录的。
  • 感谢戈登的解释!这让事情变得很清楚。非常感谢您的帮助。
  • Gordon 为什么我们将 A.id 与 AA.id 进行比较?
  • @KyleCopeland 。 . .这种比较是这样的,所以您只比较外部比较中给定行中 id 的日期。这称为相关子查询。
【解决方案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。

【讨论】:

  • 感谢 Koriander,这很有帮助!这是有道理的,为什么他会选择 x.SubDate
猜你喜欢
  • 1970-01-01
  • 2014-09-07
  • 2015-06-06
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2011-11-04
  • 2017-03-29
  • 1970-01-01
相关资源
最近更新 更多