显示表中不存在的where子句的元素

时间:2013-11-24 07:16:07

标签: sql sql-server sql-server-2005

我根据where子句中的ID列搜索表。我有一个可能存在或可能不存在于此表中的ID列表。一个简单的查询将为我提供该表中存在的ID(如果有的话)。有没有办法同时返回未找到的ID?

Table --

ID
1GH
2BN
3ER

SELECT *
FROM Table
WHERE ID IN (big list 9FG, 1GH, 3UI etc)
--If ID's in above list are not in table, then show those ids.

期望的输出 -

9FG, 3UI were not found in the table

3 个答案:

答案 0 :(得分:4)

如果我理解你需要什么,你可以这样做

SELECT q.id, 
       CASE WHEN t.id IS NULL THEN 'no' ELSE 'yes' END id_exists
  FROM
(
  SELECT '9FG' id UNION ALL
  SELECT '1GH' UNION ALL
  SELECT '3UI'
) q LEFT JOIN table1 t
    ON q.id = t.id

输出:

|  ID | ID_EXISTS |
|-----|-----------|
| 9FG |        no |
| 1GH |       yes |
| 3UI |        no |

或者如果您只需要一个不存在的ID列表

SELECT q.id 
  FROM
(
  SELECT '9FG' id UNION ALL
  SELECT '1GH' UNION ALL
  SELECT '3UI'
) q LEFT JOIN table1 t
    ON q.id = t.id
 WHERE t.id IS NULL

输出:

|  ID |
|-----|
| 9FG |
| 3UI |

诀窍是使用OUTER JOIN代替WHERE条件来过滤表中的数据,并能够看到不匹配。

这是 SQLFiddle 演示

答案 1 :(得分:2)

要搜索,您可以使用

SELECT * 
From Mytable
where id in (
   select id from (values (1), (2), (3)) as SearchedIds(Id) )

和找不到的相反:

   SELECT id from (values (1), (2), (3)) as SearchedIds(Id) 
    WHERE id not in (SELECT id From MyTable)

语法

Values(...) asSearchedIds(id) 
在Sql2008中支持

,对于Sql2005,您必须执行

( SELECT 1 as Id UNION ALL SELECT 2 UNION ALL ...etc ) as SearchedIds

注意:您可以使用JOINS(INNER和LEFT)重写这些查询

答案 2 :(得分:0)

可能是这样的:

SELECT id FROM my_table WHERE id NOT IN(val1,val2,val3)