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

时间:2018-03-05 15:42:49

标签: mysql

您好我有一个类似这样的数据库。

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 个答案:

答案 0 :(得分:0)

你的架构很奇怪,至少可以说,并且可以保持正常化,但是按照要求回答你的问题,你的问题是双重的。

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

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

  3. 从您的数据中,让我们尝试子选择:

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

    要进行更新,您需要让子选择返回1行,并且您希望将其与外部查询的行集相关联。例如,这可以为subselect提供一行,但会给你不正确的数据:

    > 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,它提供了问题提供的数据,是唯一可以唯一连接所需行的数据。

    非常普遍(有明确的例外),加入文本列和其他非索引字段表示架构设计不佳。如果这是一个严肃的项目,我强烈建议您查看至少3 rd 正常形式的模式规范化。 (我将谷歌搜索作为一种练习给读者。)

相关问题