SQL:需要删除查询中的重复行

SQL:需要删除查询中的重复行,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我需要通过使用SQL查询或过程获得此结果的帮助。下面给出了我的示例表结构 所需结果: docid status 24 Waiver Requested 26 Waiver Requested 27 Rejected 表A: docid ---------- 24 26 27 表b: docid Status 24 Waiver Requested 26 Rejected 26 Waiver Requested 27

我需要通过使用SQL查询或过程获得此结果的帮助。下面给出了我的示例表结构

所需结果:

docid    status
24       Waiver Requested
26       Waiver Requested
27       Rejected
表A:

docid
----------
24
26
27
表b:

docid     Status
24     Waiver Requested
26     Rejected
26     Waiver Requested
27     Rejected
27     Rejected

这是一篇非常好的MSDN文章“查找和/或删除重复行”
希望这会有用。

除了您给出的规则之外,您不知道所有的业务规则,这里有一个更通用的解决方案

创建另一个表(或者您的数据模型已经有一个),其中包含可能的状态:

CREATE TABLE status_rank (
   status   VARCHAR2(100) NOT NULL,
   rank     NUMBER NOT NULL,
   PRIMARY KEY (status_name)
);
此表用于按优先顺序排列状态。换句话说,如果在重复的情况下,选择“请求豁免”而不是“拒绝”,则使用1表示豁免,2表示拒绝

现在查询可以使用这个额外的排名表:

SELECT b.docid, r.status
  FROM b,
       status_rank r,
       (SELECT b.id, min(r.rank)
          FROM b, status_rank r
         WHERE b.status = r.status
         GROUP BY id) s
 WHERE b.docid = s.docid
   AND r.rank = s.rank
   AND b.status = r.status;

有很多方法可以实际执行查询,但这应该向您展示了总体思路

为什么您期望的结果是
26,请求豁免
,而不是
26,被拒绝
?你在这里使用什么标准?还有,TableB上的主键是什么?您如何知道要从TableB中选择哪一行??表B中是否有其他列可供排序??您的问题包含的上下文太少。请描述删除重复项的业务规则。您可以在表b中看到docid 26、Rejected和Requested的两个值。你用什么标准来选择一个而不是另一个?这是家庭作业吗?不一样。OP希望将业务规则应用于检测,而“重复项”并不是真正的重复项。您发布的链接用于检测所有数据相同的真实重复项。如果OP只需要执行一个没有重复结果的查询,那么选择DISTINCT就可以了。