如何查询没有响应的请求记录

时间:2014-04-29 12:48:15

标签: sql oracle oracle11g oracle10g

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

有两列UniqueNumber和Type如下: -

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

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

4 个答案:

答案 0 :(得分:3)

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

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)上的综合索引可以提高效果。

答案 1 :(得分:1)

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

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上有索引,由于连接的效率,此查询将胜过所有其他表单。

答案 2 :(得分:0)

SELECT UniqueNumber, Type FROM table
WHERE UniqueNumber IN
(SELECT  UniqueNumber, COUNT( UniqueNumber)
FROM table
GROUP BY UniqueNumber
HAVING COUNT( UniqueNumber)=1) 

......顺便说一下......

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

答案 3 :(得分:0)

您还可以尝试减号

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

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