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が1つだけ存在する必要があります。最初に、削除する必要のあるすべてのpartrefを取得する必要があります。サブクエリ(サブ選択)なしでそれを行うことは可能ですか?どうやってするの?


アップデート。

「OLD」partrefは、遅くとも作成されていないすべてのpartrefレコードです。したがって、たとえば:

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

id = 2のパーツの場合、2、3、4のような複数のpartrefが存在します。遅くとも4番目のpartrefのみが作成されているため、削除しないでください。refNumber2および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

そして、これがSQLFiddleです。

幸運を。

于 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 に答える