如何在单个表中查找不匹配的记录?

时间:2017-06-22 13:32:08

标签: sql informix

我正在抓取日志文件以获取我将插入到将用于多个挖掘任务的表中的事务记录。每个记录都有(以及其他)ID和事务类型,请求或响应。请求/响应对将具有相同的ID。

我的任务之一是找到所有没有相应响应的请求。我想把桌子加到自己身上,其中A.ID = B.ID和A.type =' req'和B.type =' res',但这给了我与我需要的相反的东西。

由于ID总是会出现一次或两次,是否有一个查询会选择ID,表中只有一次出现该ID?

3 个答案:

答案 0 :(得分:4)

这是一种非常常见的查询类型。您可以尝试使用ID汇总表格中的GROUP BY值,然后保留仅出现一次的ID

SELECT ID
FROM yourTable
GROUP BY ID
HAVING COUNT(*) = 1

如果您还想返回仅发生一次的ID的所有记录,您可以尝试这样做:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT ID FROM yourTable GROUP BY ID HAVING COUNT(*) = 1
) t2
    ON t1.ID = t2.ID

答案 1 :(得分:2)

直截了当的方式是NOT IN

select *
from mytable
where type = 'req'
and id not in (select id from mytable where type = 'res');

您可以使用NOT EXISTS编写相同的内容,但查询的可读性会稍差:

select *
from mytable req
where type = 'req'
and not exists (select * from mytable res where type = 'res' and res.id = req.id);

然后你可以使用多种形式的聚合,例如:

select *
from mytable
where type = 'req'
and id in 
(
  select id 
  from mytable 
  group by id 
  having count(case when type = 'res' then 1 end) = 0
);

答案 2 :(得分:1)

这将为您提供具有请求但不会重新启用的

npm run tests