0

これを行うためのより効率的な方法はありますか?複数のレコードを更新したくないので、2つの初期クエリが2つの異なるレコードに一致する可能性があります。

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;
4

2 に答える 2

1

COALESCE演算子とUPDATE/REPLACEステートメントを使用できます。より正確に言うと、COALESCEは、コンマ区切りのリストから最初のnull以外の値を選択します。

http://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#function_coalesce

http://dev.mysql.com/doc/refman/5.5/en/update.html

http://dev.mysql.com/doc/refman/5.5/en/replace.html

まず、UPDATEの代替手段:

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

第二に、REPLACEの選択肢。REPLACEは最初に古いエントリを削除してから、新しいエントリを再挿入することに注意してください。したがって、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
于 2012-11-21T20:55:30.183 に答える
-1
UPDATE applications SET status = vStatus WHERE appID = @AppID LIMIT 1;
于 2012-11-21T20:13:35.830 に答える