【发布时间】:2017-04-30 15:27:57
【问题描述】:
表:
CREATE TABLE `vendor_contacts` (
`vendor_id` int(11) NOT NULL,
`last_name` varchar(50) NOT NULL,
`first_name` varchar(50) NOT NULL,
`name_initials` varchar(45),
PRIMARY KEY (`vendor_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
使用以下插入语句:
INSERT INTO `vendor_contacts`
VALUES (5,'Davison','Michelle',''),
(12,'Mayteh','Kendall',''),
(17,'Onandonga','Bruce',''),
(44,'Antavius','Anthony',''),
(76,'Bradlee','Danny',''),
(94,'Suscipe','Reynaldo',''),
(101,'O\'Sullivan','Geraldine',''),
(123,'Bucket','Charles','');
我正在尝试使用以下命令分配列 name_initials,该命令源自 PostgreSQL [Update>Set>From]:
UPDATE vendor_contacts
SET name_initials = t.initials
FROM (
SELECT vendor_id, last_name, first_name,
CONCAT(LEFT(first_name, 1), LEFT(last_name, 1)) as initials
FROM vendor_contacts;
) t
WHERE vendor_id = t.vendor_id;
由于这不起作用,我尝试了 Oracle SQL Merge Into:
MERGE INTO vendor_contacts
USING (
SELECT vendor_id, last_name, first_name,
CONCAT(LEFT(first_name, 1), LEFT(last_name, 1)) as initials
FROM vendor_contacts;
) t
ON (vendor_id = t.vendor_id)
WHEN matched THEN
UPDATE SET name_initials = t.initials;
合并不起作用。
我尝试了一个子查询,但效果不佳:
UPDATE vendor_contacts vc
SET name_initials = (SELECT CONCAT(LEFT(first_name, 1), LEFT(last_name, 1))
FROM vendor_contacts vcsq
WHERE vcsq.vendor_id = vc.vendor_id);
【问题讨论】:
-
简单的
UPDATE有什么问题?我没有看到你插入任何东西。 -
有问题吗?将观察到的行为描述为“不起作用”是不准确的,并且在诊断问题时几乎没有用处。如果行为的描述更精确,例如MySQL 返回错误 1093“无法在 FROM 子句中引用目标表 'vendor_contacts' 进行更新”......这是一个更具体的问题,有一些具体的解决方法。而且由于 MySQL 不支持
MERGE语句,我们可能会推测 MySQL 返回错误 1046“您的 SQL 语法错误”。何为繁文缛节?为什么不直接更新单表?
标签: mysql merge sql-update