2017-11-09 10 views
1

自分自身から選択したクエリに基づいてテーブルを更新したいと思います。このようなテーブルから出発自分自身でクエリを実行してテーブルを更新する

__________________________ 
| id | uid | uid_seq_no | 
-------------------------- 
| 1 | a |  NULL | 
| 2 | a |  NULL | 
| 3 | b |  NULL | 
| 4 | a |  NULL | 
| 5 | b |  NULL | 
| 6 | b |  NULL | 
| 7 | a |  NULL | 
| 8 | c |  NULL | 
-------------------------- 

Iは、行のシーケンス番号にuid_seq_noを更新したいuidにスコープは、最終的な結果は、となるように:

__________________________ 
| id | uid | uid_seq_no | 
-------------------------- 
| 1 | a |  1  | 
| 2 | a |  2  | 
| 3 | b |  1  | 
| 4 | a |  3  | 
| 5 | b |  2  | 
| 6 | b |  3  | 
| 7 | a |  4  | 
| 8 | c |  1  | 
-------------------------- 

私が実行しようとしています

UPDATE keySeq a 
    SET uid_seq_no=(
    SELECT IFNULL(uid_seq_no,0)+1 FROM keySeq b 
     WHERE a.uid = b.uid AND uid_seq_no IS NOT NULL 
     ORDER BY id 
     LIMIT 1 
    ); 

私は:Table 'a' is specified twice, both as a target for 'UPDATE' and as a separate source for dataを取得します。

は私も同じようにそれを実行しようとしました:

UPDATE keySeq a 
    SET uid_seq_no=(
    SELECT n FROM (
     SELECT IFNULL(uid_seq_no,0)+1 AS n FROM keySeq b 
     WHERE a.uid = b.uid AND uid_seq_no IS NOT NULL 
     ORDER BY id 
     LIMIT 1 
    ) AS T 
    ) 

しかし、私はUnknown column 'a.uid' in 'where clause'を取得します。サブサブクエリにはクエリスコープへのアクセスがないためです。

今私はアイデアがありません。

サンプルテーブル:http://sqlfiddle.com/#!9/e3f3b6/1

答えて

1

このクエリを使用してすることができます:更新のためのランク値を設定するための

UPDATE keySeq 
left join (
    select a.id, (SELECT count(1) + 1 FROM keySeq b 
        where b.uid = a.uid and b.id<a.id) Rank 
    from keySeq a 
) xQ on xQ.Id=keySeq.id 
SET keySeq.uid_seq_no=xQ.Rank; 
0

オルタナティブ:

SELECT 
id 
, uid 
, uid_seq_no 
, ( 
    CASE uid 
    WHEN @vUid 
    THEN @vRank := @vRank + 1 
    ELSE @vRank := 1 AND @vUid := uid END 
) + 1 AS rank 

FROM keySeq, 
(SELECT @vRank := 0, @vUid := '') var 
ORDER BY uid, id 
0

をあなたは、関数ROWNUMBERを使用することができます。これは、次のようにuidによって分割されます。選択はそうのようになる:

SELECT id, uid 
     ,ROW_NUMBER() OVER (PARTITION BY uid ORDER BY id, uid ASC) [uid_seq_no] 
    FROM keySeq 
ORDER BY id 

が更新ステートメントでの選択を使用するには、更新のために明確にするために列の別名を使用することができます。ここでは

UPDATE keySeq 
    SET uid_seq_no = dT.uid_seq_no2 

    FROM (SELECT id [id2] --I use column alias here and for uid_seq_no2 
     ,uid 
     , ROW_NUMBER() OVER (PARTITION BY uid ORDER BY id, uid ASC) [uid_seq_no2] 
      FROM keySeq K1 
     ) AS dT 

WHERE id = dT.id2 

は、私がテストするために使用sqlfiddleですthis: http://sqlfiddle.com/#!6/c5bae/1

関連する問題