【问题标题】:Find values not present in supplied list postgres查找提供的列表 postgres 中不存在的值
【发布时间】:2013-06-06 17:37:48
【问题描述】:

我正在尝试查找一个查询,该查询将告诉我数据库中没有的值。 例如:

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

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

【问题讨论】:

    标签: postgresql postgresql-9.1


    【解决方案1】:

    首先,由于您似乎是 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。

    【讨论】:

    • 谢谢。我以后会遵守所有发帖提示
    【解决方案2】:
    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;
    

    【讨论】:

    • 您认为这会比 EXCEPT 更高效/更低效。似乎它会更少,但我很好奇你的想法。我发现你的回答通常都很好。 :)
    • @DavidS:我认为这不会有什么不同。但唯一的判断方法是在使用真实数据时查看执行计划。
    • 是的,我回去看了看我的,并试图用你的来做些什么。很难说,因为如此小的样本量很难说。只是想确保使用 EXCEPT 等没有众所周知的问题。同样,您是似乎总是给出非常好的答案的人之一。谢谢!
    【解决方案3】:

    如果不将所有可能的数字存储在某个表中(或仅存储 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 是用于存储值的新表的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多