获取没有子查询的引用

时间:2013-02-08 14:44:17

标签: sql oracle

我在表格中有以下数据:

select p.number, pr.refNumber from part p, partref pr where pr.refNumber = p.id;



number                                   refNumber
---------------------------------------- ---------------------- 
1                                        1                    
2                                        2
2                                        3        
2                                        4   

我需要删除旧的partrefs,部分只应存在一个partref。 首先,我需要获取应删除的所有partref。没有子查询(subselect)可以做到这一点吗?怎么做?


更新。

“OLD”partrefs是最近未创建的所有partref记录。 例如:

    refNumber                                  creationDate
---------------------------------------- ---------------------- 
1                                        01-01-13                   
2                                        01-02-13
3                                        02-02-13        
4                                        03-02-13

对于id = 2的部分,存在多个partref,如2,3,4。因为它最迟创建,所以不应该删除第4个partref。应删除带有refNumber 2和3的Partref。

2 个答案:

答案 0 :(得分:2)

鉴于您的编辑,这应该有效:

SELECT DISTINCT p.num, 
  MAX(pr.refNumber) OVER (PARTITION BY p.Num ORDER BY CreationDate DESC)  as refNumberToKeep
FROM part p
  INNER JOIN partref pr ON pr.refNumber = p.id

这是SQL Fiddle

祝你好运。

答案 1 :(得分:0)

我认为这是分析功能的一个非常好的地方。获取想要保留的参考号码非常简单。但是,它仍然需要子查询:

select *
from (select p.number, pr.refNumber, pr.CreationDate,
            MAX(ref.CreationDate) over (p.Number) as MaxCreationDate
      from part p join
           partref pr
           on pr.refNumber = p.id
     ) ppr
where CreationDate <> MaxCreationDate

顺便问一下,为什么厌恶子查询?它们非常有用,是SQL的重要组成部分。

此外,您应该使用正确的ANSI连接语法。