Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 仅基于“更新”更新一行;或;可以返回多个结果的子句_Mysql - Fatal编程技术网

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