如果first_table.email在两个选择中匹配,如何更新(从第一个选择表值更改秒)second_table.first_table_id。
如果可能的话。只需一个查询!
-----------------------------------------更新 - ---------------------------------------
示例:
如果第一个表中的电子邮件字段匹配,我需要更新第二个表的外键。我需要将两个查询结果与不同的parent_id进行比较(父项与子项位于同一个表中)
table_1
-------------------------
| id | parent_id | email |
-------------------------
1 NULL NULL
2 NULL NULL
3 1 joe@m.ru
4 2 bob@f.ly
5 1 bob@f.ly
6 2 kira@.us
table_2
----------------
| id | first_id |
----------------
1 3
2 4
3 5
4 6
我有两个父母,其中包含ID 1和2以及一些孩子(ID:3,4,5,6)。
另请注意: 1岁, 2 - 新
任务:如果儿童通过parent_id = 1
发送电子邮件,并使用parent_id = 2
匹配的chilren电子邮件(相同),则更改第二个表中的外键。
在第二个表格行的示例中,id = 3
的外键字段 - first_id必须从 5 更改为 4 。
答案 0 :(得分: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, 'joe@m.ru'
UNION ALL SELECT 4, 2, 'bob@f.ly'
UNION ALL SELECT 5, 1, 'bob@f.ly'
UNION ALL SELECT 6, 2, 'kira@.us'
)
, 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