6

我试图找到一个查询来告诉我数据库中没有的值。例如:

      select seqID, segment from flu where seqID IN (1,2,3,4,5,6,7,8,9). 

现在,如果我的数据库没有 seqID 3、8、9,我将如何仅查找/显示丢失的 seqID。

4

3 回答 3

6

首先,由于您似乎是 Stackoverflow 的新手,这里有一些礼仪和发布提示:

  • 始终包含相关的版本信息。在这里,您可能想要包含 PostgreSQL 的版本信息
  • 简明扼要地描述你想做什么
  • 包括任何相关的源代码(你做了;干得好)
  • 包括任何错误
  • 解释你想要的结果(你做到了;干得好)
  • 跟进并标记答案。对很多人来说,如果你不把正确答案归功于自己,他们就不会帮助你。只是一个提示。

由于您没有完成上述所有操作,我只能猜测,所以我根据您的代码做出一些假设。您似乎需要一个 EXCEPT 语句。以下代码是在 PostgreSQL 9.1 上开发的。

create temp table my_value(seq_id int);

insert into my_value(seq_id) values
(1), (2), (4), (5), (6), (7);

select unnest(array[1, 2, 3, 4, 5, 6, 7, 8, 9]) 
EXCEPT 
select distinct seq_id from my_value;

我假设您有一个硬编码的整数列表(就像您在问题中的示例一样)。我刚刚创建了一个临时表用于测试和演示目的,但我相信您可以根据您的情况进行必要的调整。如果您没有硬编码的整数列表,那么您只需要再次选择包含它的任何源。

希望这可以帮助。欢迎来到 Stackoverflow。

于 2013-06-06T18:02:48.510 回答
5
with idlist (id) as (
   values (1),(2),(3),(4),(5),(6),(7),(8),(9)
)
select l.id as missing_seq_id
from idlist l
  left join flu f on f.seqID = l.id
where f.seqID is null;
于 2013-06-06T18:26:22.927 回答
0

如果没有将所有可能的数字存储在某个表中(或者只是 0-9,并使用交叉连接来获取更大的数字),我不相信你可以做到这一点。您不能选择数据中不存在的 ID 或数字。如果您创建了另一个表,您的查询将如下所示:

SELECT newID
FROM newTable nt
LEFT JOIN flu f ON f.seqID = nt.newID
          AND f.seqID NOT IN (SELECT * from newTable)

newID 将是您新建的包含值的表的列名。newTable 是用于存储值的新表的名称。

于 2013-06-06T18:00:13.937 回答