簡體   English   中英

當子查詢返回多於1行時如何更新記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM