繁体   English   中英

如何将子查询与外部查询相关联以进行更新

[英]How to relate subquery to outer query for update

您好,我有一个看起来像这样的数据库。

uniqueid    description       name         phonenumber
66370         SALES       John_Doe_Cell      555-5555
87296         SALES       John_Doe_Home      555-4444
66786       ACCOUNTING    Jane_Doe_Cell      555-3333
67897       ACCOUNTING    Jane_Doe_Home      555-2222

我想运行一个查询,将拉动phonenumber用于%_Cell和电话号码转到%_Home 因此,例如在上表中,我需要将John_Doe_Cell电话号码放入John_Doe_Home电话号码,对于Jane_Doe_Cell和Jane_Doe_Home也是如此。

到目前为止,我的队列如下,但是我觉得它行不通。 我需要能够将在查找过程中找到的名称传递给%_Home以便它使用相应的电话号码更新正确的名称。

UPDATE `some_table` SET phonenumber=(SELECT phonenumber WHERE `name` LIKE '%_Cell')
WHERE queue_name LIKE '%_Home'

你的模式是奇数,至少可以这样说,并可以站进行归一化,而是要回答你的问题问的 ,你的问题是双重的。

  1. 子选择返回多个更新结果,并且

  2. 子选择结果与UPDATE集无关。

根据您的数据,让我们尝试子选择:

> SELECT phonenumber WHERE `name` LIKE '%_Cell';
+-------------+
| phonenumber |
+-------------+
| 555-5555    |
| 555-3333    |
+-------------+

要进行更新,您都需要让子选择返回1行,并且您要将其与外部查询的行集相关联。 例如,这将为您提供子选择一行,但会为您提供错误的数据:

> UPDATE `some_table` AS upd SET phonenumber = (
    SELECT phonenumber
    FROM `some_table` AS inn
    WHERE
        `name` LIKE '%_Cell'
    LIMIT 1
  )
  WHERE queue_name LIKE '%_Home';

内部查询将为每个外部行选择哪一行? (提示:尝试一下,看一下,也许是在事务中,以便您可以回滚结果。)要连接内部查询和外部查询,我猜这可能是您想要的:

> UPDATE `some_table` AS upd SET phonenumber = (
    SELECT phonenumber
    FROM `some_table` AS inn
    WHERE
        `name` LIKE '%_Cell'
    AND inn.description = upd.description
  )
  WHERE queue_name LIKE '%_Home';

请注意,给定问题提供的数据的inn.description = upd.description是唯一唯一连接所需行的数据。

在一般情况下(有明确的例外),在文本列和其他非索引字段上进行连接表示架构设计不良。 如果这是一个严肃的项目,我强烈建议您考虑将架构规范化为至少第三种规范形式。 (我将把谷歌搜索作为练习留给读者。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM