PostgreSQL:如何使用generate_series()找出列中缺失的数字?

2023-12-26

SELECT commandid 
FROM results 
WHERE NOT EXISTS (
    SELECT * 
    FROM generate_series(0,119999) 
    WHERE generate_series = results.commandid 
    );

我有一个专栏results类型的int但各种测试失败,没有添加到表中。我想创建一个返回列表的查询commandid中找不到的results。我认为上面的查询可以满足我的要求。但是,如果我使用的范围超出了预期的可能范围,它甚至不起作用commandid(如负数)。


给定样本数据:

create table results ( commandid integer primary key);
insert into results (commandid) select * from generate_series(1,1000);
delete from results where random() < 0.20;

这有效:

SELECT s.i AS missing_cmd
FROM generate_series(0,1000) s(i)
WHERE NOT EXISTS (SELECT 1 FROM results WHERE commandid = s.i);

这个替代公式也是如此:

SELECT s.i AS missing_cmd
FROM generate_series(0,1000) s(i)
LEFT OUTER JOIN results ON (results.commandid = s.i) 
WHERE results.commandid IS NULL;

在我的测试中,上述两者似乎都会产生相同的查询计划,但您应该使用以下命令与数据库上的数据进行比较EXPLAIN ANALYZE看看哪个最好。

解释

请注意,而不是NOT IN我用过NOT EXISTS在一个公式中包含一个子查询,以及一个普通的OUTER JOIN在另一个。数据库服务器更容易优化这些,并且避免了可能出现的令人困惑的问题NULLs in NOT IN.

我最初更喜欢OUTER JOIN公式化,但至少在 9.1 中我的测试数据是NOT EXISTS形式优化到相同的计划。

两者都会比NOT IN当系列很大时(就像您的情况一样),请使用下面的公式。NOT IN用于要求 Pg 进行线性搜索IN列出每个正在测试的元组,但对查询计划的检查表明 Pg 现在可能足够聪明,可以对它进行哈希处理。这NOT EXISTS(转化为JOIN由查询规划器)和JOIN工作得更好。

The NOT IN在存在 NULL 的情况下,表述会令人困惑commandids 并且可能效率低下:

SELECT s.i AS missing_cmd
FROM generate_series(0,1000) s(i)
WHERE s.i NOT IN (SELECT commandid FROM results);

所以我会避免它。对于 1,000,000 行,另外两个在 1.2 秒内完成,而NOT IN配方运行受 CPU 限制,直到我感到无聊并取消它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL:如何使用generate_series()找出列中缺失的数字? 的相关文章

随机推荐

  • htmltextwriter 和跨站点脚本

    只是一个简单的问题 我被要求浏览一个 vb 应用程序并修复所有可能发生跨站点脚本的地方 我将 是的 它确实可以保护您在写入 HTML 文档时免受 XSS 侵害 但是HtmlTextWriter WriteEncodedText https
  • C# Func(T) 不接受 ref 类型输入参数

    Can Func lt gt 接受 C 中通过引用传递的参数 static void Main Func
  • Heroku:ModuleNotFoundError:没有名为“请求”的模块

    我正在尝试将 Django 程序部署到 Heroku 该应用程序在我的本地计算机上成功运行 该计算机使用 Anaconda 和 Python 3 5 我无法让它推送到 Heroku 根据命令 gt git push heroku maste
  • 使用多设备混合应用程序构建 Visual Studio Cordova 应用程序时发生错误

    我收到 3 个致命错误 我也安装了android SDK 19 有任何想法吗 An error occurred while listing Android targets C Project AngularJS ToDo Sample f
  • 不是 JAX-WS 中的有效服务异常

    我正在参考http www mkyong com webservices jax ws jax ws hello world example http www mkyong com webservices jax ws jax ws hel
  • 使用 sqlplus 命令行隐藏纯文本密码

    我希望使用 sqlplus 命令 并在视图中隐藏密码 这样它就不会显示在 ps ef 命令中 我知道互联网博客上提供了很多解决方案 但大多数似乎都需要管理员权限 并且我对此服务器的访问受到限制 其余的似乎对我不起作用 我当前使用的命令如下
  • 在附加到 Refit 客户端的 Polly 策略中使用 ILogger

    我一直在尝试遵循以下指示这篇博文 https www stevejgordon co uk passing an ilogger to polly policies将 ILogger 传递到我的重试策略 以便记录有关重试错误的信息 博客中的
  • ember-data 作为 d3 的数据

    我想使用我的 emberdata 作为在 d3 中创建对象的数据 我尝试将控制器模型中的项目转换为新的 javascript 对象 并将这个新数组提供给 d3 数据 这是代码 App GraphicsView Ember View exte
  • smart-table - 如何重置过滤器集合?

    Angular 和智能表新手 此智能表设置可以正常工作并正确过滤 但尝试重置或清除过滤器不会重新过滤表 为什么不 使用 ng model 绑定更新输入是否不会触发 smart table 正在寻找的监视 Plunker 可以在这里找到 ht
  • h1 和跨度

    在我的 html 中使用 h1 h6 标签时 我不断收到 w3c 验证器上的错误消息 我对此很陌生 我已经尝试了很多次来解决这个问题 但我不能 该文本在我的网站上显示得很好 但无法验证 我该如何解决这个问题 错误信息如下 第 34 行 第
  • 如何在CodeIgniter中获取表的最后一条记录?

    如何在Codeigniter中获取表的最后一条记录 我的表名称是 post 我想获取该表中最后一条记录的最后一个 id 或下一个 id recommended don t use from getting rows insted of pl
  • 如何使用 Web API 2 + AspNet Identity 2 扩展 IdentityRole

    我正在尝试扩展最新版本的 Visual Studio 2013 中的 Web API 2 包含个人帐户 模板中提供的 AspNet IdentityRole 类 当我点击 api roles 时 它返回一个空数组 身份模型 namespac
  • python 中不可散列对象的集合

    有没有相当于python的东西set对于不可散列的对象 例如可以相互比较但不能散列的自定义类 如果你的值不可散列 那么就有no point在使用set 只需使用一个list反而 如果您的所有对象所能做的就是测试相等性 那么您必须扫描每个元素
  • WC_Checkout 挂钩中订单行项目和订单元之间的差异

    我正在创建一个正在使用的插件woocommerce checkout update order meta用于添加订单项元数据的钩子 我有一个插件叫WooCommerce TM 额外产品选项安装 这个插件使用woocommerce check
  • 使用forever和always语句

    以下两个代码都会生成一个时钟 我需要知道除了时钟生成之外 永远循环是否还有其他用途 我只在时钟一代中遇到过永远 如果只是为了这个目的 那岂不是毫无用处 initial begin clk 0 forever begin 5 clk clk
  • CakePHP 和 SSL

    我刚刚在使用 CakePHP 的网站上安装了 SSL 证书 现在该网站不再从 webroot 加载文件 图像 css 文件 有任何想法吗 我认为 SSL 安装影响了 mod rewrite 或类似的东西 我刚刚遇到这个问题 检查您的 apa
  • SQL“AT TIME ZONE”,查询范围并使用“SELECT”所有列(表名。*)表达式

    I use timestamp 3 with time zone在我的数据库中 当需要一个表时 这几乎是我的情况的任何情况 我需要在比以下更复杂的查询中选择表的所有列 我的问题是如何使用 SQL 获取所需时区的时间戳 带时区 at time
  • svn - 如何下载 llvm、clang 的特定版本

    当我 svn co llvm 3 3 clang 3 3 compiler rt 时 构建通过 但构建没有在构建 调试 断言中创建 clang exe 当我只为 svn co build 添加 clang 时 没有通过 但他创建了 clan
  • 由于长数据类型导致的 VBA-Excel 溢出错误

    这似乎太容易了 但我是如此绝望 我需要做的是得到最后的值列 D 的 数量大 前任 987654321 如果值只有两位数 则代码没问题 我只是无法识别问题所在 Dim lastRow As Long lastRow Cells Rows Co
  • PostgreSQL:如何使用generate_series()找出列中缺失的数字?

    SELECT commandid FROM results WHERE NOT EXISTS SELECT FROM generate series 0 119999 WHERE generate series results comman