5

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

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

我在做什么的基本想法:

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

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

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

我搜索了在 Google 和此站点上的查询中未找到的返回记录,但仍然一无所获。

4

3 回答 3

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);

这将返回所需的值。

于 2012-11-07T19:14:12.010 回答
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. LEFT JOIN 保留派生表中的值,v即使 table1 中不存在该记录
  4. 然后,我们只保留无法匹配的记录,即t1.column1 is null
  5. 我已将您选择的第一列切换到从v. column2 被删除,因为它始终为空
于 2012-11-07T20:29:54.377 回答
1

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

警告因为我无权访问 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 OR 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 的 select from dual 更好。

于 2012-11-07T19:06:25.763 回答