在查询中返回未找到的值

时间:2012-11-07 18:57:43

标签: sql sql-server sql-server-2008-r2

我正在研究一个项目,我有一个需要检查的数千条记录的列表。我需要提供未找到的列表,并提供我用来查找它们的查询,以便我的上级可以检查他们的工作。

我承认我对SQL比较陌生。我无权创建临时表,这是我想到的一种方法。

我正在做的基本想法:

select t.column1, t.column2
from table1 t
where t.column1 in ('value1','value2','value3')

如果value1和value3在数据库中,但value2不在,我需要显示value2而不是其他。

我已尝试ISNULL,嵌入查询,并尝试从查询中选择NOT值。

我搜索了在Google和此网站上的查询中找不到的返回记录,但仍未找到任何内容。

3 个答案:

答案 0 :(得分:2)

我尝试过类似的东西:

首先创建一个包含所需的所有值的表。

让我们说

create table table_values(values varchar2(30));

然后尝试如下的in子句:

select * from table_values tv where tv.value not in (select t.column1
from table1 t);

这将返回所需的值。

答案 1 :(得分:1)

在SQL Server 2008中,您可以使用语法VALUES(...)(...)(...)创建派生表,例如

    select v.value
      from (
           values ('value1'),('value2'),('value3')
           ) v(value)
 left join table1 t on t.column1 = v.value
     where t1.column1 is null

注意:

  1. VALUES之后的每个(...)都是一行,您可以拥有多个列。
  2. 派生表之后的v(value)是指定给表的别名和列名。
  3. 即使表1中不存在记录,LEFT JOIN也会保留派生表v的值
  4. 然后,我们只保留无法匹配的记录,即t1.column1 is null
  5. 我已将您选择中的第一列切换为v中的列。删除column2因为它始终为null

答案 2 :(得分:0)

解决方案可能适用于Oracle,其中dual是单行单列表。你需要 一个表,您可以在其中虚拟选择所需的值!

警告因为我无权访问db我从未在下面测试过查询。

SELECT tab_all.col_search, t.column1, t.column2
FROM
(
   Select value1 AS col_search from dual
   union all
   Select value2 from dual
   union all
   Select value3 from dual
) tab_all left join  table1 t
on col_search = t.column1
WHERE t.column1 is null;

我相信sqlserver相当于Oracle的 SELECT value1 FROM dual是 SELECT value1或SELECT'value1'。

所以试试

SELECT tab_all.col_search, t.column1, t.column2
FROM
(
   Select value1 AS col_search
   union all
   Select value2 AS col_search
   union all
   Select value3 AS col_search
) tab_all left join  table1 t
on col_search = t.column1
WHERE t.column1 is null;

因为我不是sqlserver的人可能就是这样 RichardTheKiwi版本的Oracle选择来自双核更好。