2012-01-26 7 views
0

更新する方法(最初の選択テーブルの値から2番目の値に変更)second_table.first_table_id(両方ともselect_table.emailが一致する場合)UPDATE FROM SELECTの親にある外部キーを使用して

でも可能です。 1つのクエリで!

-----------------------------------------更新--- --------------------------------------

例:

電子メールフィールドが最初のテーブルで一致する場合、2番目のテーブルの外部キーを更新する必要があります。 3,4,5:私は、ID 1と2といくつかの子供を持つ2人の親(IDを持っている

  table_1 
------------------------- 
| id | parent_id | email | 
------------------------- 
    1  NULL  NULL  
    2  NULL  NULL 
    3  1   [email protected] 
    4  2   [email protected] 
    5  1   [email protected] 
    6  2   [email protected] 

    table_2 
---------------- 
| id | first_id | 
---------------- 
    1  3 
    2  4 
    3  5 
    4  6 
  1. (親が子供たちと同じテーブルにである)異なるPARENT_IDを持つ2つのクエリの結果を比較する必要があります、6)。

  2. また、心に留めておく:1 - 古い2 - 新

  3. タスク:子供がparent_id = 2試合でparent_id = 1とchilrenメールでメールしている場合第二のテーブルに外部キーを変更する(しています同じ)。 id = 3その外部キーフィールドを有する第2のテーブルの行の我々の例で

  4. - first_idはにから変更しなければなりません。

+1

私はあなたの質問を徹底的に2回読みましたが、それでも理解できません。サンプルデータを表示するために質問を更新してください。ああ、 "はい"私はそれが1つのクエリで行うことができると思う - 私はちょうどあなたがしたいことを*正確に*知りません。 – Bohemian

+0

'table_2.id'カラムは必要なものに重複していますか? –

+0

あなたが何を意味しているか完全に理解していませんでした。しかし、table_2.idは参照用です。 – Pol

答えて

1

あなたは

UPDATE Table_2 t2u 
SET  first_id = (
    SELECT t2.first_id 
    FROM Table_2 t2 
      INNER JOIN Table_1 t1 ON t1.id = t2.first_id 
      INNER JOIN (
      SELECT parent_id = MAX(parent_id), email 
      FROM Table_1 
      GROUP BY 
        email 
     ) t1p ON t1p.email = t1.email 
      INNER JOIN Table_1 t1i ON t1i.email = t1p.email 
             AND t1i.parent_id = t1p.parent_id 
    WHERE t2u.first_id <> t1i.id) 

テストスクリプト(SQL Serverなど)

;WITH Table_1 (id, parent_id, email) AS (
    SELECT 1, NULL, NULL  
    UNION ALL SELECT 2, NULL, NULL 
    UNION ALL SELECT 3, 1, '[email protected]' 
    UNION ALL SELECT 4, 2, '[email protected]' 
    UNION ALL SELECT 5, 1, '[email protected]' 
    UNION ALL SELECT 6, 2, '[email protected]' 
) 
, Table_2 (id, first_id) AS (
    SELECT 1, 3 
    UNION ALL SELECT 2, 4 
    UNION ALL SELECT 3, 5 
    UNION ALL SELECT 4, 6 
) 
SELECT t2.*, t1i.id as [update with] 
FROM Table_2 t2 
     INNER JOIN Table_1 t1 ON t1.id = t2.first_id 
     INNER JOIN (
      SELECT parent_id = MAX(parent_id), email 
      FROM Table_1 
      GROUP BY 
        email 
     ) t1p ON t1p.email = t1.email 
     INNER JOIN Table_1 t1i ON t1i.email = t1p.email 
            AND t1i.parent_id = t1p.parent_id 
WHERE t2.first_id <> t1i.id 

出力

を始めるかもしれません、次の
+0

私はそのクエリを理解しようとしています。そして私には質問があります。 tabel_1.id = 1(古いもの)とid = 2(新しいもの)のクエリ参照はどこにありますか。私はこの正確な親のIDで子供を変える必要があるからです。 – Pol

+0

あなたは 'parent_id'を意味し、それが参照されるのは' MAX(parent_id) 'です。あなたが本当に 'id'を意味するならば、私は完全に誤解しています。 –

+0

あなたは私がtable_1.parent_idを意味していたことを正しく表しています。 – Pol