8

私がやりたいことは、すべての患者に、1 で始まる一意の患者コードを設定することです。これは、行 ID に基づいていません。Id は順序のみを指定します。このようなもの:

patient_id  patient_code
    2           1
    3           2
    4           3

これは私のクエリです:

UPDATE patients p1
SET p1.patient_code = (
    SELECT COUNT( * ) 
    FROM patients p2
    WHERE p2.patient_id <= p1.patient_id 
)

しかし、それはエラーをスローしています:

#1093 - You can't specify target table 'p1' for update in FROM clause

このスレッドを見つけました: Mysql エラー 1093 - FROM 句で更新するターゲット テーブルを指定できません
しかし、承認された回答 this を適用して、COUNT に必要なサブクエリ WHERE を操作する方法がわかりません。

4

4 に答える 4

10
UPDATE
    patients AS p
  JOIN
    ( SELECT 
          p1.patient_id
        , COUNT(*) AS cnt 
      FROM 
          patients AS p1
        JOIN 
          patients AS p2
            ON p2.patient_id <= p1.patient_id 
      GROUP BY 
          p1.patient_id
    ) AS g
    ON g.patient_id = p.patient_id
SET 
    p.patient_code = g.cnt ;
于 2013-01-03T12:36:22.697 に答える
3

有効な解決策を見つけましたが、これは単なる回避策です:

SET @code=0;
UPDATE patients SET patient_code = (SELECT @code:=@code+1 AS code)
于 2013-01-03T12:30:59.313 に答える
1

これを試して、

UPDATE patients p1 INNER JOIN
(
    SELECT COUNT(*) as count,patient_id
    FROM patients
    group by patient_id  
)p2 
SET p1.patient_code=p2.count
WHERE p2.patient_id <= p1.patient_id

SQL_LIVE_DEMO

于 2013-01-03T12:36:03.390 に答える