[英]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'
你的模式是奇数,至少可以这样说,并可以站进行归一化,而是要回答你的问题问的 ,你的问题是双重的。
子选择返回多个更新结果,并且
子选择结果与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.