10

データのテーブルを選択し、このデータを同様の列名を持つ別のファイルに挿入しようとしています (これは本質的に重複データです)。現在の構文は次のとおりです。

INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT similiarId, similiarId2, similiarCol1, similiarCol2  
FROM TABLE2

私が抱えている問題は、新しく挿入されたレコードに対して (整数として宣言された) 一意のキー フィールドを生成することです。table1には既存のデータがあり、重複するキー値でエラーが発生するため、table2のキーは使用できません。

テーブル スキーマを変更できません。これらは、DB によって自動的に生成されないカスタム ID 列です。

4

10 に答える 10

9

要件に応じて、次のようにクエリを実行する必要があります。

INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT (ROW_NUMBER( ) OVER ( ORDER BY ID ASC )) 
+ (SELECT MAX(id) FROM TABLE1) AS similiarId
, similiarId2, similiarCol1, similiarCol2  
FROM TABLE2

ここで何をしたか: 1 から始まるものを
追加したので、宛先テーブルの ID の機能も追加しました。ROW_NUMBER()MAX()

より良い説明については、この SQLFiddle を参照してください。

于 2012-08-16T06:15:40.260 に答える
9

table1 の id フィールドには自動インクリメントがありますか? もしそうなら、挿入からsimilarIdを失い、自動インクリメントに一意のキーを任せることはできますか?

INSERT INTO TABLE1 (id2, col1, col2) SELECT similiarId2, similiarCol1, similiarCol2
FROM TABLE2
于 2012-06-18T18:09:08.443 に答える
5

私があなたを正しく理解しているかどうかわかりません: TABLE2 からすべてのデータをコピーしたいのですが、TABLE2.similiarId が TABLE1.id に含まれていないことを確認してください。おそらくこれが問題の解決策です:

DECLARE @idmax INT
SELECT @idmax = MAX(id) FROM TABLE1

INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT similiarId + @idmax, similiarId2, similiarCol1, similiarCol2  
FROM TABLE2

挿入されたすべての ID が ID ウィッチが既に存在するよりも大きくなるため、主キー違反が原因で挿入が失敗することはなくなりました。

于 2012-08-10T14:09:13.280 に答える
3

id フィールドが auto-id として定義されていて、それを挿入ステートメントから除外すると、SQL は使用可能なプールから一意の ID を生成します。

于 2012-06-18T18:10:07.187 に答える
2

同一のテーブルを作成したい場合は、単に(すばやくダーティ)を使用しないのはなぜですか?INTOメソッドを選択しますか?

SELECT * INTO TABLE2
FROM TABLE1 

お役に立てれば。

于 2012-08-15T09:31:16.960 に答える
2

SQL Server には関数 ROW_NUMBER があります。正しく理解できていれば、次のコードで必要なことを実行できます。

    INSERT INTO TABLE1 (id, id2, col1, col2)
    SELECT (ROW_NUMBER( ) OVER ( ORDER BY similiarId2 ASC )) + 6 AS similiarId, 
similiarId2, similiarCol1, similiarCol2  
    FROM TABLE2

ROW_NUMBER は各行の番号を取得し、それに「魔法の値」を追加して、それらの値を TABLE1 の現在の最大 ID とは異なるものにすることができます。現在の最大 ID が 6 であるとすると、ROW_NUMBER の各結果に 6 を追加すると、7、8、9 などになります。この方法では、TABLE1 の主キーに同じ値はありません。

Google に問い合わせたところ、Sybase にも関数 ROW_NUMBER があるとのことでした ( http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sqlanywhere.12.0.1/dbusage/ ug-olap-s-51258147.html)なので、試してみるといいと思います。

于 2012-08-10T04:35:59.717 に答える
1

カスタム ID でない場合は、table1 ID を IDENTITY にします。

また

table1 に新しい主キーを作成して IDENTITY にすると、以前の ID を同じ形式で保持できます (主キーではありません)。

于 2012-06-18T18:09:00.287 に答える
1

Table1.Id の Table2 に列を追加することをお勧めします。このようにして、両方のキーのセットを保持します。

(データ マージで忙しい場合、Table1.Id を保持することは、Table1.Id を参照する可能性のある外部キーにとって重要な場合があります。その場合、Table1.Id を参照するテーブルの外部キーを「修正」する必要があります。表 2 の該当するキーを参照します)。

于 2012-06-18T18:09:23.833 に答える
0

2 番目のテーブルが 1 番目のテーブルと同様の値を保持する必要がある場合は、2 番目のテーブルには適用auto incrementしないでください。

于 2012-08-16T13:12:26.850 に答える