【问题标题】:MySQL equivalent to perform UPDATE SET FROM / MERGE INTOMySQL相当于执行UPDATE SET FROM / MERGE INTO
【发布时间】: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


【解决方案1】:

为什么会出现所有这些并发症,为什么不只是?

UPDATE vendor_contacts 
SET name_initials = CONCAT(LEFT(first_name, 1), LEFT(last_name, 1));

它根据其他列的值设置首字母字段。

但即使是这个查询也是你不应该运行的。正确的做法是删除name_initials 列。你不需要它。因为它是简单计算的结果,通常不会为简单计算创建列。您可以使用生成的列,也可以使用简单的。

SELECT *, 
CONCAT(LEFT(first_name, 1), LEFT(last_name, 1)) AS name_initials FROM vendor_contacts;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2015-04-25
    • 2013-03-20
    • 1970-01-01
    • 2017-02-24
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多