0

これは私の現在のシナリオです:

1 つの列を除いてまったく同じ 2 つのテーブル (TB1 & TB2) があります。リモート SQL データベースからすべてをコピーし、現在の行を削除して新しい行を挿入する TB1 のすべてを更新する CRON があるため、TB1 がソース テーブルです。

TB2 の構造は TB1 とまったく同じですが、最後の行が true から false に変わります。デフォルトは false です。以下のサンプル テーブルを参照してください。

TB1
+--------------+---------------+---------------+- --------------+
| | ID | 列1 | 列2 |列3 |
+--------------+---------------+---------------+- --------------+
| | 1 | 値1 | val-A |false |
| | 2 | 値2 | val-B |false |
| | 3 | 値1 | val-C |false |
| | 4 | 値3 | val-D |false |
| | 5 | 値4 | val-E |false |
+--------------+---------------+---------------+- --------------+



TB2
+--------------+---------------+---------------+- --------------+
| | ID | 列1 | 列2 |列3 |
+--------------+---------------+---------------+- --------------+
| | 1 | 値1 | val-A |真 |
| | 2 | 値2 | val-B |false |
| | 3 | 値1 | val-C |真 |
| | 4 | 値3 | val-D |false |
+--------------+---------------+---------------+- --------------+

ご覧のとおり、TB1 には追加の行 id=5 があります。col1 と col2 の両方の組み合わせは一意であり、それを検出しようとしているため、TB1.col1 と TB1.col2 の両方の新しい組み合わせは、TB2.col3 を維持しながら TB2 にコピーする必要があります。

私は次のことを試しましたが、私の場合は実際には機能しません。これは、組み合わせた違いではなく、すべての異なる値のみを表示するためです。

選択 TB1.col1、TB1.col2 FROM (
TB1 から TB1.col1、TB1.col2 を選択
ユニオンオール
TB2 から TB2.col1、TB2.col2 を選択
) TB1
TB1.col1 でグループ化
HAVING count(*) = 1
TB1.col1 によるオーダー

私は INSERT 部分が欠けていることを知っていますが、両方または少なくとも SELECT に関する助けをいただければ幸いです。

ありがとう!

4

3 に答える 3

1

私は次のようにします:

INSERT INTO TB2 (col1, col2, col3) SELECT col1, col2, col3 FROM TB1 ON DUPLICATE KEY UPDATE col3=col3;

egyal が言った一意のキーを使用します。私が覚えていることから、INSER IGNORE は失敗したすべての挿入を無視しますが、これは col3 にとって望ましくない可能性があります。

于 2013-10-21T19:25:29.420 に答える
1

TB2overで定義された一意のキー(col1, col2)を使用すると、次を使用できますINSERT IGNORE ... SELECT

INSERT IGNORE INTO TB2 (col1, col2, col3) SELECT col1, col2, col3 FROM TB1;
于 2013-10-21T19:19:20.053 に答える
1

私のSQLでマイナスが利用できるとは思わないが、外部結合は機能するはずだ

http://sqlfiddle.com/#!2/e73e4/1/0

Insert into tb2 (
Select tb1.ID, tb1.Col1, tb1.Col2, tb1.Col3 from tb1 
LEFT JOIN tb2 on Tb1.col1=tb2.col1 and Tb1.col2=tb2.col2
Where tb2.col1 is null);

しかし、私はあなたが求めていたものを見逃している可能性があります...

于 2013-10-21T19:29:08.097 に答える