您好我有一个类似这样的数据库。
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'
答案 0 :(得分:0)
你的架构很奇怪,至少可以说,并且可以保持正常化,但是按照要求回答你的问题,你的问题是双重的。
子选择返回多个更新结果,
子选择结果与UPDATE集无关。
从您的数据中,让我们尝试子选择:
> 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 正常形式的模式规范化。 (我将谷歌搜索作为一种练习给读者。)