1

我在表中有以下数据:

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   

我需要删除旧的 partref,part 应该只存在一个 partref。首先,我需要获取所有应该删除的 partref。没有子查询(子选择)可以做到吗?怎么做?


更新。

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

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

对于 id = 2 的部分,存在多个部分引用,如 2、3、4。只有第 4 部分引用不应被删除,因为它是最晚创建的。应该删除 refNumber 为 2 和 3 的 Partref。

4

2 回答 2

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

祝你好运。

于 2013-02-08T14:47:59.047 回答
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 连接语法。

于 2013-02-08T14:57:33.380 回答