2012-01-26 50 views
0

如何更新(从第一个选择表值第二个更改)second_table.first_table_id如果first_table.email匹配两个选择。UPDATE FROM SELECT with with foreign key on parent with one query

如果它甚至可能。有一个查询!

----------------------------------------- UPDATE --- --------------------------------------

例:

如果电子邮件字段在第一个表中匹配,我需要更新第二个表的外键。我需要比较不同PARENT_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. 我有两个父母IDS 1和2以及一些儿童(IDS:3,4,5 ,6)。

  2. 而且,要记住:1 - 老2 - 新

  3. 任务:改变在第二表的外键,如果孩子电子邮件parent_id = 1和孩子电子邮件parent_id = 2比赛(是一样)。

  4. 在我们的第二个表行与id = 3它的外键字段的例子 - first_id必须从更改为。

+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 

输出

id   first_id update with 
----------- ----------- ----------- 
3   5   4 
+0

我想了解那个查询。我有一个问题。在tabel_1.id = 1(这是旧的)和id = 2(新的)的查询引用中。因为我需要用这个确切的父母的孩子来改变孩子。 – Pol

+0

假定你的意思是'parent_id',它是被引用的'MAX(parent_id)'。如果你确实是指'id',我完全误解了。 –

+0

你对我的意思是table_1.parent_id。 – Pol