2011-12-06 8 views
-1

SQL Server 2008のテーブル:TABLE1SQL:同じテーブル内のコピーレコードの

ID DESC  TYP SUBSET VAL1 VAL2 VAL3 VAL4 PReview Country 

1 DESC1 1  1  1.0 1.1 1.2 1.2 0   1 
2 DESC1 1  1  2.0 1.1 1.2 1.2 0   1 
3 DESC1 1  1  1.0 1.1 1.2 1.2 0   1 
4 DESC2 2  1  3.0 2.1 1.7 1.8 0   1 
5 DESC2 2  1  4.0 3.1 1.7 1.9 0   1 
6 DESC2 2  1  5.0 6.1 1.5 1.6 0   1 
13 DESC1 1  1  1.0 1.1 1.2 1.2 1   1 
14 DESC1 1  1  2.0 1.1 1.2 1.2 1   1 
15 DESC1 1  1  1.0 1.1 1.2 1.2 1   1 

16 DESC2 2  1  1.0 6.1 1.7 1.2 1   1 
17 DESC2 2  1  2.0 4.1 6.2 8.2 1   1 
18 DESC2 2  1  1.0 8.1 7.2 1.9 1   1 

私は、各レコードを一意に定義する方法はありませんプレビュー0を持つレコードにプレビュー= 1を持つレコードをコピーする必要があります。彼らが秩序ある方法でコピーされていることを告げる。 レコード13は、レコード14は、レコード15は、おかげで録音3

にコピーされるべきであるレコード2 にコピーされるべきレコード1 にコピーされなければなりません。

+2

"各レコードを一意に定義する方法はありません" ... ID列は一意に見えます。それはない? –

+1

プレビュー= 0、プレビュー= 1の行が同数存在しますか? –

+1

-1ハーフトレイン質問のための - 十分な細部には至っていません。何をしようとしているのか、アルゴリズムがどのように働いているのかについては非常に貧弱です。 「コピーする」とは何を伴いますか?どのレコードがどの関連レコードに「コピー」されているかはどのように判断していますか?コピーした後、元の行/ターゲット行はどうなりますか? –

答えて

1

基本的な考え方は、ソースとデスティネーションの両方の行を「列挙」することです。インデックス1のソース行をインデックス1のインデックス行に、インデックス2のソース行をデスティネーション行に割り当てます。平易な英語で

UPDATE TABLE1 
SET 
    [DESC] = SOURCE.[DESC], 
    TYP = SOURCE.TYP, 
    SUBSET = SOURCE.SUBSET, 
    VAL1 = SOURCE.VAL1, 
    VAL2 = SOURCE.VAL2, 
    VAL3 = SOURCE.VAL3, 
    VAL4 = SOURCE.VAL4, 
    PREVIEW = SOURCE.PREVIEW, 
    COUNTRY = SOURCE.COUNTRY 
FROM (
    SELECT DEST_ID, SRC.* 
    FROM 
     (SELECT ID DEST_ID, RANK() OVER (ORDER BY ID) R FROM TABLE1 WHERE PREVIEW = 0) DEST 
     JOIN (SELECT *, RANK() OVER (ORDER BY ID) R FROM TABLE1 WHERE PREVIEW = 1) SRC 
      ON SRC.R = DEST.R 
) SOURCE 
WHERE TABLE1.ID = SOURCE.DEST_ID 

:2など指数

  • は、ID(RANK() OVER (ORDER BY ID))のために、ここでPREVIEW = 0行にインデックスを取り付けます。
  • PREVIEW = 1の場合と同じにします。
  • 送信元と宛先のインデックスを一致させます(JOIN ... ON SRC.R = DEST.R)。
  • その一致に基づいてテーブルを更新します。最初のクエリの実行がすべての宛先行を更新せず、第実行は同じソース行につながる可能性が -

先行の数は、ソース行の数よりも小さい場合に注意してください異なる宛先行ににコピーされています。

実際には、同じソース行を複数の宛先行にコピーしています。

+0

@ Branko ..感謝&提案のための感謝。私はそれを試してみましょう...しかし、私は前にインデックスを使用したことがないし、私はあなたの解決策に行くために何を変更する必要があるか分からない: – shazia

+0

私は私のサンプルデータを更新しました..あなたはそれを見て、あなたのソリューションはそれと共に動作します。一方、私はインデックスを理解するために私の頭を傷つけるでしょう。どうもありがとう。 – shazia

+0

@shazia私がすでに説明した警告に注意を払うと、私の解決策が新しいテストデータではうまくいかない理由はわかりません。実際に試しましたか?それはあなたが望むことをしますか? –

1

プレビュー= 0のレコード「の上にコピー」にレコードが必要な場合は、あなただけのことができませんでした:

  • はあなたがそれぞれの2つのコピーを持っているので、preview = 0記録
  • は各preview = 1レコードを複製削除は、 。

これはあなたが求めているように聞こえます。

+0

提案のおかげでアダム..他のテーブルにリンクされているので、プレビュー= 0レコードを削除することはできません。私がアイデンティティの列を必要としなかった場合に働いた – shazia

関連する問題