如果记录重复,则选择具有最大ID的记录。

3

我有一个查询,返回一些记录的旧版本(由于糟糕的数据库设计),我试图只获取最新的记录。因此,我尝试获取具有最大Id的记录,但查询很复杂,有很多记录。所以这样的子查询不起作用:

SELECT row 
FROM table 
WHERE id=(
    SELECT max(id) FROM table
    )

以下是我的问题。顺便说一下,我的公司正在使用Testlink,如果您熟悉它并且对此有更好的解决方案,将不胜感激。

SELECT req_doc_id, scope,nh.parent_id,nh.id
FROM (SELECT nh.id, req_doc_id,doc_id FROM nodes_hierarchy nh,
req_specs r1, requirements r2 
WHERE nh.parent_id = r1.id AND nh.id = r2.id 
AND (r1.doc_id LIKE '%BlaBla%' OR r1.doc_id LIKE '%Tralala%')) 
AS t1, nodes_hierarchy nh, req_versions r1 
WHERE t1.id = nh.parent_id AND nh.id = r1.id

结果集如下:

 NAME..................ID              
____

BlaBla1..............163        

BlaBla1..............190

BlaBla2..............173

Tralala..............15

Tralala2.............26

Tralala2.............19

What I want is:

 NAME..................ID              
____


BlaBla1..............190

BlaBla2..............173

Tralala..............15

Tralala2.............26

我们可以再确认一下您使用的关系型数据库是哪个吗? - Strawberry
欢迎来到 Stack Overflow!请勿破坏您的帖子。通过在 Stack Exchange 网络上发布内容,您已授予 SE 分发该内容的不可撤销权利(根据 CC BY-SA 3.0 许可证)。根据 SE 的政策,任何破坏行为都将被撤销。如果您想要将此帖子与您的账户分离,请参阅正确的分离请求程序是什么? - Suraj Rao
2个回答

0
SELECT TB.NAME,TB.ID FROM TABLE TB
INNER JOIN
(
   SELECT NAME,MAX(ID) ID FROM TABLE GROUP BY NAME
)INNERTABLE ON INNERTABLE.ID=TB.ID

尝试上述查询。


就像我之前所说的,由于记录数量很多,子查询语句会导致查询速度变慢,并且该查询已经非常复杂。 - user8368320
1
@LabadaEfel2 这不是子集查询。这是唯一优化的方式..!! - Sagar Gangwal
2
这是一个子查询。但这并不意味着它不高效。 - Strawberry
很多内连接?不会的!这不是SQL的工作方式!只有一个内连接,所以它不会比一个内连接更耗费。但如果你说的是很多查询,也不会。它将为每个名称查询最大(ID),并告诉其他查询:“这些是你要找的ID”。如果你仍然担心这样做的成本,那么如果GroupBy和Max是一个大请求,请更新你的服务器。 - Drag and Drop
{btsdaf} - MatBailie
显示剩余2条评论

-1

给你:

 SELECT Name,Notes
 FROM (select nh.id ,req_doc_id as Name, scope as Notes  from 
 (select nh.id,req_doc_id,doc_id  from nodes_hierarchy nh ,
 req_specs r1, requirements r2 
 where nh.parent_id = r1.id  and nh.id = r2.id 
 and ( r1.doc_id like '%Tralala%'
 or r1.doc_id like '%BlaBla' ) )    

 as t1,
 nodes_hierarchy nh, req_versions r1 
 where t1.id = nh.parent_id  and nh.id = r1.id ) AS TABLO
 INNER JOIN(
 SELECT MAX(nh.id) ID ,scope FROM  (select nh.id,req_doc_id,doc_id  from nodes_hierarchy nh ,
 req_specs r1, requirements r2 
 where nh.parent_id = r1.id  and nh.id = r2.id 
 and (r1.doc_id like '%Tralala%'
 or r1.doc_id like '%BlaBla' ) )  

 as t1, nodes_hierarchy nh, req_versions r1 where t1.id = nh.parent_id  and nh.id = r1.id GROUP BY req_doc_id)
 INNERTABLE on INNERTABLE.ID = TABLO.ID;

我认为我们不应该倡导过时的连接语法。 - Strawberry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接