代码之家  ›  专栏  ›  技术社区  ›  jpabluz

SQL-不在解释中

  •  3
  • jpabluz  · 技术社区  · 15 年前

    我在一个项目中工作,该项目需要SQL结果的最佳性能,并希望优化查询,但经过一些尝试和错误后,我在中遇到了一些问题。

    -- THIS RETURNS NO RESULTS AT ALL.
    SELECT sysdba.HISTORY.TICKETID FROM sysdba.HISTORY  
         where TICKETID = 't6UJ9A002MJC'                                         
    
    -- THIS RETURNS 4 RESULTS.
    SELECT sysdba.C_TICKETPROVIDERS.* FROM sysdba.C_TICKETPROVIDERS 
         where sysdba.C_TICKETPROVIDERS.TICKETID = 't6UJ9A002MJC'
    
    -- THIS RETURNS NO RESULTS AT ALL.
    SELECT sysdba.C_TICKETPROVIDERS.* FROM sysdba.C_TICKETPROVIDERS 
         where sysdba.C_TICKETPROVIDERS.TICKETID NOT IN 
            (SELECT DISTINCT sysdba.HISTORY.TICKETID FROM sysdba.HISTORY) 
    

    至少

    5 回复  |  直到 15 年前
        1
  •  2
  •   Alex Bagnolini    15 年前

    NOT IN (NULL) 在你的 WHERE clausole返回false。

    尝试:

    SELECT sysdba.C_TICKETPROVIDERS.* FROM sysdba.C_TICKETPROVIDERS 
         where NOT EXISTS 
             (SELECT TOP 1 1 
              FROM sysdba.HISTORY
              WHERE sysdba.HISTORY.TICKETID  = sysdba.C_TICKETPROVIDERS.TICKETID) 
    
      • 如果它找到它,它将返回 1 NOT EXISTS 克劳索失败了,这是意料之中的。
      • NULL ,以及 不存在 我们会成功的。
        2
  •  3
  •   ozczecho    15 年前

        3
  •  1
  •   Charles Bretana    15 年前

    SELECT sysdba.C_TICKETPROVIDERS.* FROM sysdba.C_TICKETPROVIDERS  
         where sysdba.C_TICKETPROVIDERS.TICKETID NOT IN  
            (SELECT DISTINCT sysdba.HISTORY.TICKETID 
             FROM sysdba.HISTORY 
             Union
             Select 'xxxxxxxxxxxxxxxx') 
    

    如果这有效,你的问题是在你的平台上, Not In 将无法针对空集正常工作。。。

        4
  •  1
  •   Massimo Fazzolari    15 年前

    (SELECT DISTINCT sysdba.HISTORY.TICKETID FROM sysdba.HISTORY) 返回 NULL .

    勾选的id 2不在(空)?错误的

    勾选的id 3不在(空)?错误的

    没有任何记录可以匹配您的where条件 NOT IN . 所以你一点结果也没有。

    SELECT sysdba.C_TICKETPROVIDERS.* FROM sysdba.C_TICKETPROVIDERS 
         where NOT EXIST  
            (SELECT TOP 1 sysdba.HISTORY.TICKETID FROM sysdba.HISTORY
             WHERE  HISTORY.TICKETID=sysdba.C_TICKETPROVIDERS.TICKETID)
    
        5
  •  0
  •   Mauro    15 年前

    我发现我比其他人更清楚。

    最后检查数据库的排序规则类型,可能是排序规则区分大小写,出于某种原因,一个是大写的,另一个不是?