我有订单管理系统,我有一张桌子。可以有一个请求应该有响应。例如: -
有两列UniqueNumber和Type如下: -
A Request
A Response
B Request
C Request
D Request
E Request
E Response
C Response
我想查询表中有请求但没有响应的唯一数字。例如,在上述情况B和D
中答案 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,易于阅读。