有谁知道仅当其中一个列与表中另一行中的同一个列不相等时才更新行吗?
让我解释。考虑一下这张桌子。它存储一些预订,管理员可以决定批准哪个预订。
Booking | Time | Approved
0 | 5:00 | NO
1 | 5:00 | NO
2 | 6:00 | YES
3 | 6:00 | NO
预订请求可能会重叠,例如“预订0”和“ 1”就是这种情况。管理员可以决定批准0还是1。
但是批准的预订不能重叠。例如,由于预订2已在6:00批准,因此预订3无法被批准。除非管理员决定先拒绝预订2。
我将如何为此编写查询以确保不会发生冲突?我在考虑以下方面的想法:
UPDATE requests
SET Approved = 'YES'
WHERE Booking = 3
AND NOT EXISTS (
(SELECT Time
FROM requests
WHERE Booking = 3)
=
(SELECT Time
From requests
WHERE Booking != 3)
);
但这是行不通的。
任何帮助将非常感激。
作为旁注。我的实际问题有点复杂。桌子看起来更像
Booking | Start Time | End Time |Approved
0 | 5:00 | 6:00 | NO
1 | 5:00 | 7:00 | NO
2 | 6:00 | 8:00 | YES
3 | 6:00 | 9:00 | NO
而且我正努力防止预订重叠。但是我敢肯定,如果我对问题的简单版本使用正确的语法,那么我也将能够找出复杂的版本。
您使用不NOT EXISTS
正确。它的参数应该是单个子查询,而不是比较两个子查询的表达式。在您的情况下,子查询中的条件是时间相同,但ID与您要更新的ID不同,而另一个ID已被批准。
UPDATE request AS r1
SET approved = 'YES'
WHERE r1.id = 3
AND NOT EXISTS (
SELECT *
FROM request AS r2
WHERE r2.time = r1.time AND r2.id != r1.id AND r2.approved = 'YES'
)
要解决该错误,请使用该LEFT JOIN / NULL
模式。
UPDATE request AS r1
LEFT JOIN request AS r2 ON r2.time = r1.time AND r2.id != r1.id AND r2.approved = 'YES'
SET r1.approved = 'YES'
WHERE r1.id = 3 AND r2.id IS NULL
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句