比使用“A UNION (B in A)”更高效的 SQL?

2024-01-24

编辑1(澄清):感谢您迄今为止的回答!反响令人欣慰。
我想稍微澄清一下这个问题,因为根据答案,我认为我没有正确描述问题的一个方面(我确信这是我的错,因为我什至很难为自己定义它)。
问题在于:结果集应仅包含 tstamp 介于“2010-01-03”和“2010-01-09”之间的记录,以及one记录第一组中每个 order_num 的 tstamp 为 NULL 的位置(将会有always每个 order_num 的 tstamp 为空)。
到目前为止给出的答案似乎包括all某个 order_num 的记录(如果有)anytstamp 介于“2010-01-03”和“2010-01-09”之间。例如,如果有另一条记录 order_num = 2 且 tstamp = 2010-01-12 00:00:00 它应该not包含在结果中。

原问题:
考虑一个包含 id(唯一)、order_num、tstamp(时间戳)和 item_id(订单中包含的单个商品)的订单表。 tstamp 为 null,除非订单已被修改,在这种情况下,会有另一条具有相同 order_num 的记录,并且 tstamp 包含更改发生时的时间戳。

例子...



id  order_num  tstamp               item_id
__  _________  ___________________  _______
 0          1                           100
 1          2                           101
 2          2  2010-01-05 12:34:56      102
 3          3                           113
 4          4                           124
 5          5                           135
 6          5  2010-01-07 01:23:45      136
 7          5  2010-01-07 02:46:00      137
 8          6                           100
 9          6  2010-01-13 08:33:55      105
  

检索在某个日期范围内已被修改一次或多次的所有订单(基于 order_num)的最有效的 SQL 语句是什么?换句话说,对于每个订单,我们需要具有相同 order_num 的所有记录(包括具有 NULL tstamp 的记录),对于每个 order_num,其中至少一个 order_num 的 tstamp NOT NULL AND tstamp BETWEEN '2010-01-03'和“2010-01-09”。我遇到困难的是“其中至少一个 order_num 的 tstamp NOT NULL”。

结果集应如下所示:



id  order_num  tstamp               item_id
__  _________  ___________________  _______
 1          2                           101
 2          2  2010-01-05 12:34:56      102
 5          5                           135
 6          5  2010-01-07 01:23:45      136
 7          5  2010-01-07 02:46:00      137
  

我想出的SQL是这样的,本质上是“A UNION (B in A)”,但它执行缓慢,我希望有一个更有效的解决方案:



SELECT history_orders.order_id, history_orders.tstamp, history_orders.item_id
FROM
   (SELECT orders.order_id, orders.tstamp, orders.item_id
    FROM orders
    WHERE orders.tstamp BETWEEN '2010-01-03' AND '2010-01-09')
    AS history_orders
UNION
SELECT current_orders.order_id, current_orders.tstamp, current_orders.item_id
FROM
   (SELECT orders.order_id, orders.tstamp, orders.item_id
    FROM orders
    WHERE orders.tstamp IS NULL)
    AS current_orders
WHERE current_orders.order_id IN
   (SELECT orders.order_id
    FROM orders
    WHERE orders.tstamp BETWEEN '2010-01-03' AND '2010-01-09');
  

也许是一个子查询:

select * from order o where o.order_num in (select distinct
  order_num from order where tstamp between '2010-01-03' and '2010-01-09')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比使用“A UNION (B in A)”更高效的 SQL? 的相关文章

  • T-SQL - 字符串连接

    希望有人可以提供帮助 我是一个新手 SQL 黑客 而且确实很糟糕 我在 SQL Server 2005 上有两个表 TABLE 1 和 TABLE2 TABLE1 COL1 COL2 1 10 2 20 3 30 4 10 4 20 5 2
  • 为什么我的查询在参数化后会中断?

    我有 2 张桌子 Sales and Product Sales可以将产品存储为Idn or Name 传统设计 和Type列指定实际type与之相关 Product等是连接的子集表into这个表来获取真实的数据 在这个例子中 Produc
  • django pyodbc 数据源名称未找到

    当尝试连接到我的数据库服务器和 Django 中的数据库时 我收到错误 django db utils InterfaceError IM002 IM002 Microsoft ODBC Driver Manager 未找到数据源名称且未指
  • 如何获取共同好友列表

    你好 我想知道如何才能找到共同的朋友 我目前在思考这个问题时遇到问题 我有一个名为 users 的表 它是这样的 id name 1 Kenny 2 Jack 3 Jimmy 4 Chris 5 Meg 6 Jake 7 Micheal 8
  • 在 AppEngine 项目之外使用 Google AppEngine 数据存储区

    对于我的小框架Pyxer http code google com p pyxer 我希望能够在 AppEngine 项目之外使用 Google AppEngine 数据存储 因为我现在已经习惯了这种 ORM 模式 对于一些快速的黑客来说
  • SQL FORMAT 函数错误

    这个SQL select FORMAT lNum from rpt myView 产生以下错误 参数数据类型 varchar 对于格式的参数 1 无效 功能 lNum is a varchar 10 运行 SQL Server 2012 v
  • MySQL 中有“connect by”替代方案吗?

    如果我使用 Oracle 有connect by可用于创建分层查询的关键字 目前我正在一个项目中使用MySQL 我想知道是否有替代方案connect by在 MySQL 中 我尝试过谷歌 但到目前为止还没有结果 我想要实现的是通过一个查询从
  • SQL如何显示某个日期之前的数据

    我有几张桌子 一个是一个工人表显示工人代码 名字和姓氏 工作日期其中显示工人代码 工作开始日期 结束日期和工作区域代码 导师有工人编号 名字 姓氏和工作区号 Job area有工作区域代码名称和主管 我想要做的是在日期 10 09 10 之
  • Linq 选择与另一个表中的 ID 相等的项目

    我不确定这怎么可能 但我有两个表 我想通过表 1 的值从表 2 中获取值 表 1 有一个名为 rank 的外键 它是int 表 2 有一个名为 name 的值 它是string 现在表 1 的 排名 与表 2 的 ID 相关 所以当我说 v
  • 如何在 SQL 中选择“上一条”和“下一条”记录?

    I am building a blog post detail page on my site that will display display a previous and next link similar to how a typ
  • Postgres 上的 C 语言环境和 Posix 语言环境有什么区别?

    我知道 Postgres 上的数据库区域设置负责国家字符的正确顺序 正确的小写 大写等 但为什么有两种语言中立的语言环境 posix and c 它们之间有什么区别 还是只是一个中立的语言环境有两个不同的名称 UPDATE正如 Magnus
  • 如何在 SQL 中进行广度优先搜索?

    给定一棵存储为关系的树 Parent Child 1 2 1 3 3 4 3 5 2 6 7 8 7 9 如何获取给定节点的所有后代 例如 对于 1
  • 删除或更改 ETL 中的记录

    我有一个表 我在上面构建了 ETL 服务 货物记录 到达 离开 进入表格 我已经这样做了 我的桌子将被删除 当项目标识符第二次到达数据库时 两条记录都被删除 label cost time x2 29 14 5 2020 01 00 00
  • 从 SQL Server 中的子查询值或其他聚合函数获取平均值

    我有 SQL 语句 SQL Server SELECT COUNT ActionName AS pageCount FROM tbl 22 Benchmark WHERE DATEPART dw CreationDate gt 1 AND
  • TSQL:无法对 COUNT(*) 执行聚合函数 AVG 来查找一天中最繁忙的时间

    考虑一个保存日志数据的 SQL Server 表 重要的部分是 CREATE TABLE dbo CustomerLog ID int IDENTITY 1 1 NOT NULL CustID int NOT NULL VisitDate
  • SQL查询获取最后两条记录的DateDiff

    我有一个名为 Event 的表 其中 eventNum 作为主键 日期作为 SQL Server 2008 R2 中的 datetime2 7 我试图获取表中最后两行的日期并以分钟为单位获取差异 这就是我目前所拥有的 Select DATE
  • VIEW for 表结合 UNION ALL 的 MySQL 性能

    假设我有 2 张桌子MySQL create table persons id bigint unsigned not null auto increment first name varchar 64 surname varchar 64
  • jDBI中如何进行内查询?

    我怎样才能在 jDBI 中执行这样的事情 SqlQuery select id from foo where name in
  • SQL Server查询麻烦,多对多关系

    不知道如何用一行字来表达这个问题 对标题表示歉意 我的数据库中有3个表 例如 Shop Item 商店库存 Shop 和 Item 具有多对多关系 因此 ShopStock 表将它们链接起来 ShopStock 中的字段是 ID ShopI
  • Postgresql:SERIAL 在约束 INSERT 失败时递增

    有一个像这样的简单表结构 CREATE TABLE test id INT PRIMARY KEY sid SERIAL 我注意到如果我尝试插入一行但它未通过约束测试 即主键约束 SERIAL计数器无论如何都会增加 所以下一次成功插入 si

随机推荐