我在表格中有以下数据:
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。
答案 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连接语法。