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

时间:2011-11-14 12:53:58

标签: 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     Rejected
27     Rejected

2 个答案:

答案 0 :(得分:0)

不了解您提供的所有业务规则,这是一个更通用的解决方案。

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

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;

有很多方法可以实际进行查询,但这应该会向您展示一般的想法。

答案 1 :(得分:-1)

这是一篇非常好的MSDN文章“查找和/或删除重复行” http://archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=DuplicateRows 希望这会有用。