【问题标题】:SQL NOT IN ClauseSQL NOT IN 子句
【发布时间】:2011-01-12 08:48:06
【问题描述】:

我的查询没有按预期工作

Q1:
SELECT id, name 
FROM vw_x 
WHERE id NOT IN (select pid from table_x)
GROUP BY id, name
Having max(c_date) > GETDATE()

Q2:
SELECT id, name 
FROM vw_x 
GROUP BY id, name
Having max(c_date) > GETDATE()

即使我知道这些 id 不在 table_x 中,Q1 也没有返回任何内容 Q2 在没有 NOT IN 的情况下正常运行

我的查询可能有什么问题?

【问题讨论】:

    标签: .net sql tsql sql-server-2005 notin


    【解决方案1】:

    你的表中有一个 NULL 值

    试试这个

    SELECT id, name 
    FROM vw_x 
    WHERE id NOT IN (select pid from table_x where pid is not null)
    GROUP BY id, name
    Having max(c_date) > GETDATE()
    

    或者这个

    SELECT id, name 
    FROM vw_x 
    WHERE  NOT EXISTS (select 1 from table_x  where pid = vw_x.id  )
    GROUP BY id, name
    Having max(c_date) > GETDATE()
    

    另见Select all rows from one table that don't exist in another table

    【讨论】:

      【解决方案2】:

      使用左连接怎么样?

      SELECT id, name 
      FROM vw_x 
      LEFT JOIN table_x on id = pid
      WHERE pid IS NULL
      GROUP BY id, name
      Having max(c_date) > GETDATE()
      

      【讨论】:

        【解决方案3】:

        还有另一种情况:子查询可能什么也不返回。 如果 NOT IN 子句返回空列表,SQL Server 将无法按预期工作。我有如下查询:

        select * from table where id not in (select id from tableB where somecondition(x))
        

        当子查询包含 id 列表时,查询将按预期返回数据。但是当子查询什么都不返回时,查询还是会返回数据,然后就卡住了。

        我将查询更改为以下并解决了问题:

        select * from table where id not in (select id from tableB where somecondition(x) **union all select 0**)
        

        确保子查询至少包含一个数字。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-14
          • 1970-01-01
          相关资源
          最近更新 更多