[英]How to update records when subquery returns more than 1 row
例如,我需要自動/隨機分配一個“新”領導者來領導學生(從每種類型中僅選擇1名學生),並且每天假設領導者表中共有10個領導者。
但是我通過使用下面的查詢來得到錯誤的結果,它將在第一時間將所有學生更新為相同的領導者ID。
UPDATE students
SET student_status = 'assigned'
, leader_id = 'abc'
WHERE student_id IN
( SELECT student_id
FROM
( SELECT *
FROM students
) s
WHERE student_status = 'New'
GROUP
BY type_id)
我的預期結果類似於以下查詢,但我不想運行其他邏輯來生成隨機的student_id:
UPDATE students
SET student_status='assigned', leader_id='abc'
WHERE student_id IN ('T0123','S0222','T7777','S8888')
student_id | type_id | leader_id | student_status
-----------+---------+-----------+---------------
T0121 | Type 1 | xyz | assigned
T0122 | Type 1 | | new
T0123 | Type 1 | | new
S0221 | Type 2 | | new
S0222 | Type 2 | | new
S0223 | Type 2 | xyz | assigned
T7777 | Type 3 | | new
T7779 | Type 3 | xyz | assigned
S8888 | Type 4 | xyz | assigned
S8887 | Type 4 | | new
S8886 | Type 4 | | new
使用RAND()獲取介於1和最大Leader_id之間的隨機leader_id,以及使用ROW_NUMBER和OVER獲取每個類型的隨機student_id的子查詢以進行更新
UPDATE students s
JOIN (SELECT type_id, student_id, ROW_NUMBER() OVER (PARTITION BY type_id ORDER BY RAND()) rnum
FROM students
WHERE status = 'new') r ON r.type_id = s.type_id AND
r.student_id = s.student_id AND
rnum = 1
SET leader_id = (SELECT CEIL(RAND() * MAX(leader_id)) FROM leaders),
status = 'assigned'
WHERE status = 'new'
對於MySQL:
UPDATE students
SET student_status='assigned', leader_id='abc'
WHERE student_id IN (
SELECT student_id FROM (
SELECT * FROM students) AS s
WHERE student_status ='New' GROUP BY type_id ORDER BY RAND()
)
這應該工作。 這將每次從每種類型中選擇一名新學生,並將相應地更新狀態和領導者ID。
UPDATE students
SET student_status = 'assigned'
, leader_id = 'abc'
WHERE student_id IN (
SELECT student_id FROM (
SELECT c.student_id, c.student_status, c.type_id
FROM students C
WHERE c.student_status = 'New'
ORDER BY RAND()
) AS shuffled_items
GROUP BY type_id
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.