0

テンプレートとして機能する約 100 のレコードと、元のレコードを逆参照する 10000 を超えるコピー レコードを含むテーブルがあります。対応するオリジナルのコピーのフィールドを再初期化する必要がありますが、サブクエリから外部フィールドを参照できない理由がわかりません。

テーブルの例 ( SQLFiddle リンク):

ID   OriginalID    String
----------------------------
1    NULL          original 1
2    NULL          original 2
3    1             copy of 1
4    2             copy of 2
5    2             another copy of 2

望ましい結果:

1 no change
2 no change
3 string should change to 'original 1'
4 string should change to 'original 2'
5 string should change to 'original 2'

私が試したSQL:

update data as target set target.string=(select string from 
(select string from data as source where source.id=target.originalid) as x);

エラー:

Unknown column 'target.originalid' in 'where clause'
4

5 に答える 5

2
UPDATE data a
       INNER JOIN data b
          ON a.originalid = b.id
SET a.data = b.data

出力

╔════╦════════════╦════════════╗
║ ID ║ ORIGINALID ║   STRING   ║
╠════╬════════════╬════════════╣
║  1 ║ (null)     ║ original 1 ║
║  2 ║ (null)     ║ original 2 ║
║  3 ║ 1          ║ original 1 ║
║  4 ║ 2          ║ original 2 ║
║  5 ║ 2          ║ original 2 ║
╚════╩════════════╩════════════╝
于 2013-03-15T15:49:51.813 に答える
1

サブクエリは直接の親クエリのデータにしかアクセスできないため、このエラーが発生しています。の知識はありますが、サブクエリのSELECT string FROM () as x知識はありません。target.*ただし、単一のクエリで同じテーブルを選択して書き込むこともできません。

おそらくこれを行うためのより洗練された方法があります...別のテーブルにこのデータを入力してから、2つのテーブルの名前を変更することをお勧めします。

于 2013-03-15T15:45:59.200 に答える
1

何かのようなもの:

 UPDATE data d
       JOIN
         ( SELECT id, data
             FROM data
             WHERE originalid IS NULL
         ) AS do
  SET d.data = do.data
  WHERE d.originalid = do.id;

SQLフィドル

于 2013-03-15T16:00:29.163 に答える
1

次の SQL を試してみると、目的が達成されることがわかります (うまくいけば)。

UPDATE data
  SET String = c.String
  FROM data INNER JOIN data c ON c.ID = data.OriginalID
于 2013-03-15T15:47:54.153 に答える
1
update  data d2 join data d1 on d1.Id = d2.OriginalId
set     d2.data = d1.data;
于 2013-03-15T15:50:08.210 に答える