Mysql 仅基于“更新”更新一行;或;可以返回多个结果的子句
有没有更有效的方法?我不想更新多个记录,两个初始查询可能会匹配两个不同的记录Mysql 仅基于“更新”更新一行;或;可以返回多个结果的子句,mysql,Mysql,有没有更有效的方法?我不想更新多个记录,两个初始查询可能会匹配两个不同的记录 SET @AppID = (SELECT appID FROM employees WHERE ssn = vSSN); IF @AppID IS NULL THEN SET @AppID = (SELECT appID from applications WHERE appDate = vDate); END IF; UPDATE applications SET status = vStatus WHE
SET @AppID = (SELECT appID FROM employees WHERE ssn = vSSN);
IF @AppID IS NULL THEN
SET @AppID = (SELECT appID from applications WHERE appDate = vDate);
END IF;
UPDATE applications
SET status = vStatus
WHERE appID = @AppID;
您可以使用COALESCE操作符和UPDATE/REPLACE语句。更准确地说,COALESCE从逗号分隔的列表中选择第一个非空值 首先,更新替代方案:
UPDATE applications AS app
INNER JOIN (
SELECT COALESCE(employees.appID, applications.appID) AS appID
FROM applications
LEFT OUTER JOIN employees
ON employees.ssn = vSSN
WHERE applications.appDate = vDate
-- do some ordering or filtering if the date is not unique
LIMIT 1) AS app2
ON app.appID = app2.appID
SET app.status = vStatus
第二,替代方案。请注意,“替换”首先删除旧条目,然后重新插入新条目。因此,employees.appID可能不是applications.appID的外键
REPLACE INTO applications (appID, status)
SELECT COALESCE(employees.appID, app2.appID) AS appIdToModify, vStatus
FROM applications AS app2
LEFT OUTER JOIN employees
ON ssn = vSSN
WHERE app2.appDate = vDate
如果
选择appid。。。vdate
query无论如何都会返回多行。您不能将结果集分配给一个变量,只能分配给一个单独的值。不会的,实际查询更复杂,不会有多个结果。问题是employees表上的查询和applications表上的查询都可能返回不同的结果,我只想更新其中一个(优先于与employees表匹配的查询)。这是一个外键,但为什么我不能将COALESCE查询作为子查询进行更新呢?这不管用吗?谢谢,这很有道理,所以我把它作为我接受的答案。我稍后会测试它。优化代码FTW!这并不能真正回答问题,因为要更新的行需要由逻辑优先级确定。
REPLACE INTO applications (appID, status)
SELECT COALESCE(employees.appID, app2.appID) AS appIdToModify, vStatus
FROM applications AS app2
LEFT OUTER JOIN employees
ON ssn = vSSN
WHERE app2.appDate = vDate