对更新查询使用 Join,更新行而不是列

Using Join on an update query, updating on rows rather than columns

提问人:Ebrahim Amini Sharifi 提问时间:8/1/2023 最后编辑:Ebrahim Amini Sharifi 更新时间:8/2/2023 访问量:38

问:

我需要一个查询来实现第二个表结果,如果可能的话,请在SQL SERVER和MYSQL数据库中描述 我想将 meta_key 是 bankaccount 的行meta_value与 meta_key 是 iban 的行的相应meta_value更新。

更新前(原文):example_table

document_id meta_key meta_value
1 伊班 IBAN123456
1 银行账户 ACCT987654
2 伊班 IBAN555555
2 银行账户 ACCT444444
3 伊班 IBAN888888
3 银行账户 ACCT333333

运行 SQL 更新查询后:

document_id meta_key meta_value
1 伊班 IBAN123456
1 银行账户 IBAN123456
2 伊班 IBAN555555
2 银行账户 IBAN555555
3 伊班 IBAN888888
3 银行账户 IBAN888888
mysql sql-server 联接 sql-update

评论


答:

0赞 Ebrahim Amini Sharifi 8/1/2023 #1

您希望将 where is 的行更新为对应的 from 行 where is 。meta_valuemeta_keybankaccountmeta_valuemeta_keyiban

下面是一个用于实现此目的的 SQL 查询 - MySQL:

UPDATE example_table AS p1
INNER JOIN (
    SELECT document_id, meta_value AS iban
    FROM example_table
    WHERE meta_key = 'iban'
) AS p2 ON p1.document_id = p2.document_id
SET p1.meta_value = p2.iban
WHERE p1.meta_key = 'bankaccount';

SQL Server:

UPDATE p1
SET p1.meta_value = p2.iban
FROM example_table AS p1
INNER JOIN (
    SELECT document_id, meta_value AS iban
    FROM example_table
    WHERE meta_key = 'iban'
) AS p2 ON p1.document_id = p2.document_id
WHERE p1.meta_key = 'bankaccount';

解释:

  1. 该表是 的别名,也是子查询的别名。p1example_tablep2
  2. 子查询选择 和 其中 是 。document_idmeta_valuemeta_key'iban'
  3. 主查询使用 to match between 和 subquery 。INNER JOINdocument_idp1p2
  4. 然后,它使用 from where is 进行更新。meta_valuep1ibanp2meta_key'bankaccount'

请记住在运行任何更新查询之前备份数据库,并首先在安全的环境中对其进行测试!