【问题标题】:How to query for request records that do not have response如何查询没有响应的请求记录
【发布时间】:2014-04-29 12:48:15
【问题描述】:

我有一个订单管理系统,其中有一张桌子。可以有一个应该有响应的请求。例如:-

有 2 列 UniqueNumber 和 Type 如下:-

A Request
A Response
B Request
C Request
D Request
E Request
E Response
C Response

我想查询表中那些有请求但没有响应的唯一数字。例如在上述情况 B 和 D

【问题讨论】:

    标签: sql oracle oracle11g oracle10g


    【解决方案1】:

    您可以选择所有请求并删除具有响应的请求:

    SELECT t1.UniqueNumber
    FROM your_table t1
    WHERE t1.Type = 'Request'
      AND NOT EXISTS
      (
        SELECT 1
        FROM your_table t2
        WHERE t2.UniqueNumber = t1.UniqueNumber
        AND t2.Type = 'Response'
      )
    

    使用(Type, UniqueNumber) 上的复合索引可以提高性能。

    【讨论】:

    • 谢谢。感谢你的帮助。但是当我计算“左连接”查询的计划时,它似乎比这个查询更有希望。虽然这个查询和我需要的一样。
    【解决方案2】:

    使用带有过滤掉匹配项的条件的左自连接:

    select t1.UniqueNumber
    from mytable t1
    left join mytable t2 on t2.UniqueNumber = t1.UniqueNumber
      and t2.type = 'Response'
    where t1.type = 'Request'
    and t2.type is null
    

    此查询有效,因为连接条件尝试通过将类型测试放入连接条件中来查找响应,并且错过的连接返回值的空值,而 where 子句查找这些值。

    只要在 UniqueNumber 上有索引,由于连接的效率,此查询的性能将优于所有其他形式。

    【讨论】:

    • 谢谢。感谢您的帮助。
    【解决方案3】:
    SELECT UniqueNumber, Type FROM table
    WHERE UniqueNumber IN
    (SELECT  UniqueNumber, COUNT( UniqueNumber)
    FROM table
    GROUP BY UniqueNumber
    HAVING COUNT( UniqueNumber)=1) 
    

    ......顺便说一句......

    如果您的唯一编号可以重复两次,则它不是唯一编号,我希望您有一个用于索引和性能目的的主键,尽管 UniqueNumber 和类型的组合会产生一个唯一的连接主键。

    【讨论】:

      【解决方案4】:

      你也可以试试减号

        select t1.uniqueNumber
          from myTable t1
         where t1.type = 'Request'
        minus
        select t1.uniqueNumber
          from myTable t1
         where t1.type = 'Response'
      

      这种方式通常很快,而且 IMO 易于阅读。

      【讨论】:

        猜你喜欢
        • 2019-01-10
        • 1970-01-01
        • 2016-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多