我正在为我插入到将用于多个挖掘任务的表中的事务记录刮取日志文件。每个记录都有(除其他外)一个ID和一个交易类型,无论是请求还是响应。请求/响应对将具有相同的ID。如何在单个表中查找不匹配的记录?
我的任务之一是找到所有没有相应响应的请求。我考虑将表加入自己,其中A.ID = B.ID和A.type ='req'和B.type ='res',但是这给我与我所需要的相反。
由于ID总是会出现一次或两次,是否有一个查询可以选择ID,而在表中只有一个ID出现?
我正在为我插入到将用于多个挖掘任务的表中的事务记录刮取日志文件。每个记录都有(除其他外)一个ID和一个交易类型,无论是请求还是响应。请求/响应对将具有相同的ID。如何在单个表中查找不匹配的记录?
我的任务之一是找到所有没有相应响应的请求。我考虑将表加入自己,其中A.ID = B.ID和A.type ='req'和B.type ='res',但是这给我与我所需要的相反。
由于ID总是会出现一次或两次,是否有一个查询可以选择ID,而在表中只有一个ID出现?
这是一种非常常见的查询类型。您可以尝试使用GROUP BY
汇总表格中的ID
值,然后保留仅显示一次的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
这会给你有要求的那些,但不respose
SELECT *
FROM your_table A LEFT OUTER JOIN
your_table B ON A.ID = B.ID
AND A.type = 'req' and B.type = 'res'
WHERE B.ID IS NULL
直接的方法是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
);
'SELECT * FROM the_table WHERE NOT EXISTS(SELECT * FROM the_table B where A.ID = B.ID AND A.type ='req'and B.type ='res');' – joop