1

次のようなテーブルがあります。

CREATE Table tblClassProperty (
    ClassPropertyID integer IDENTITY(1,1) PRIMARY KEY,
    Active bit DEFAULT 0 NOT NULL,
    DEL bit DEFAULT 0 NOT NULL,
    FINAL bit DEFAULT 0 NOT NULL,
    Locked bit DEFAULT 0 NOT NULL,
    _Project integer FOREIGN KEY REFERENCES tblProject(ProjectID),
    _Property integer FOREIGN KEY REFERENCES tblProperty(PropertyID),
    _Class integer FOREIGN KEY REFERENCES tblClass(ClassID)
    CONSTRAINT CClassProperty UNIQUE(_Project,_Property,_Class))

古いテーブル (別の DB 内) からこのテーブルにデータを移行しています。ほとんどの列について、他のテーブルからデータをコピーしているだけです。外部キー列は古い DB には存在しません。新しい DB の対応するテーブルにリンクされたランダムな値です。あなたのソリューションでは、列 _Project、_Property、および _Class の値を現在の方法で生成する必要があることを当然のことと考えてください ( SELECT TOP 1 ...)

INSERT INTO ClassDB..tblClassProperty (Active, DEL, FINAL, Locked, 
    _Project, _Property, _Class)
SELECT Active, DEL, FINAL, Locked, 
    (SELECT TOP 1 ProjectID FROM ClassDB..tblProject ORDER BY NEWID()),
    (SELECT TOP 1 PropertyID FROM ClassDB..tblProperty ORDER BY NEWID()),
    (SELECT TOP 1 ClassID FROM ClassDB..tblClass ORDER BY NEWID()),
FROM ClassDB_Access..tblClassProperty

ここでINSERT INTO、一意の制約が原因でスクリプトは実行されず、制約はそのままにしておく必要があります。

私の質問: 既存の列をコピーし、上記のように外部キーを生成するスクリプトが必要ですが、タプル ( _Project, _Property, _Class) に対して生成された値は、制約に従って一意になります。

スクリプトは SQL Server 2008 R2 で実行する必要があり、将来的には Oracle でも実行する必要があります。

4

1 に答える 1

0

3 つの列すべてをクロス結合し、それらにランダムな行番号を割り当てて、row_number で拡張された tblClassproperty に結合し直すことができます。

; with randomized as (
   select a.ProjectID,
          b.PropertyID,
          c.ClassID,
          row_number() over(order by newid()) rn
     from ClassDB..tblProject a
    cross join ClassDB..tblProperty b
    cross join ClassDB..tblClass c
),
ordered as (
   select Active, DEL, FINAL, Locked,
          row_number() over (order by newid()) rn
     from ClassDB_Access..tblClassProperty
)
INSERT INTO ClassDB..tblClassProperty (Active, DEL, FINAL, Locked, 
    _Project, _Property, _Class)
select ordered.Active, ordered.DEL, ordered.FINAL, ordered.Locked, 
       randomized.projectID, randomized.PropertyID, randomized.ClassID
  from ordered
 inner join randomized
    on ordered.rn = randomized.rn

これは、cte パーツを再編成しないと Oracle では機能しません。または、即時の互換性のために派生テーブルを使用してこれを書き直すこともできます。

免責事項:構文チェック以外はテストされていません。パフォーマンスはひどいかもしれません。

編集: s の値が重複している場合は、IDクロス結合の前に個別に実行することをお勧めします。

于 2012-08-17T15:05:20.043 に答える