【问题标题】:sub query not returning expected results子查询未返回预期结果
【发布时间】:2013-01-03 18:45:36
【问题描述】:

令人困惑的查询结果或缺少...

我正在尝试通过从集合中排除可能已经存在于第二个表中的记录来返回记录集。

SELECT        trID
FROM            ttTrct
WHERE        (trID NOT IN
             (SELECT rteVehID
              FROM  rtHist
              WHERE  (rteSchedDT = '11/19/2012 12:00:00 AM')))


ORDER BY tractorID

实际的where子句是...

WHERE  (rteSchedDT = CAST(@targetDate AS DATETIME))

但也一直在尝试使用静态日期值以避免出现任何问题。

rtHist中存在3条记录

 rteVehID    rteSchedDT
 NULL        11/12/2012 12:00:00 AM
 NULL        11/19/2012 12:00:00 AM
 1645        11/19/2012 12:00:00 AM

ttTrct中存在5条记录

 trID
 1234
 4567
 9874
 1645
 2442

我希望我的结果集包含 4 条记录,而不是 1645 条记录。但我只得到 NULL。此外,如果 rtHist 表中的第三条记录也是 NULL 而不是 1645,我也没有得到任何结果。当然,静态日期最终会是一个变量。

关于我缺少什么的任何想法?提前致谢。 SSEE 2008 R2

【问题讨论】:

    标签: tsql subquery


    【解决方案1】:

    你可以使用NOT EXISTS:

    SELECT trID
    FROM  ttTrct t
    WHERE not exists (SELECT rteVehID
                       FROM  rtHist h
                       WHERE  rteSchedDT = '11/19/2012 12:00:00 AM'
                         and t.trID = h.rteVehID)
    ORDER BY tractorID
    

    SQL Fiddle with Demo

    这是一篇关于NOT INEXISTSLEFT JOIN 之间区别的精彩文章:

    NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: SQL Server

    【讨论】:

    • 绝对棒极了!!!谢谢!!!!出于某种原因,我不能将此标记为答案。我很快会再试一次。
    【解决方案2】:

    我也遇到过类似的情况,空值滑入子查询并搞砸了。试试

    ...
    WHERE  (rteSchedDT = '11/19/2012 12:00:00 AM'
            and rteScheDT is not null)))
    ...
    

    我怀疑这不是问题所在,但值得一试。

    还有,为什么

    (rteSchedDT = CAST(@targetDate AS DATETIME))
    

    ?只需将 @targetDate 设为日期时间变量即可。

    【讨论】:

      【解决方案3】:

      原因是NOT IN 子句扩展为一系列AND 语句。由于将任何值与NULL 进行比较是NULLAND NULL 总是导致NULL,所以你的where 子句永远不会是TRUE。总是NULL

      试试:

      SELECT   trID
      FROM     ttTrct
      WHERE    (trID NOT IN
               (SELECT rteVehID
               FROM  rtHist
               WHERE  (rteSchedDT = '11/19/2012 12:00:00 AM')
                   AND rteVehID IS NOT NULL))
      

      或者,您可以只使用连接,它很可能具有相同或更好的执行计划:

      SELECT     t.trID
      FROM       ttTrct t
      INNER JOIN rtHist r
              ON t.trID = r.rtHist
      WHERE      r.rteSchedDT = '11/19/2012 12:00:00 AM'
      

      Source

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-31
        相关资源
        最近更新 更多