挿入

2016-07-06 8 views
0

我々はテーブル、TABLE_1持つ新しいランキング列バグ:挿入

DATA 
1 
2 
3 
4 
5 
NULL 

我々はDATA列以下

DATA,RANK 
1,1 
2,2 
3,3 
4,4 
5,5 
NULL,0 

に基づいてRANK列を生成するには、私たちのコードです:

ALTER TABLE ` TABLE_1` 

ADD COLUMN `RANK` DOUBLE NOT NULL AFTER `DATA`; 

INSERT INTO TABLE_1 

SELECT B.DATA, 

CASE WHEN B.DATA IS NULL THEN 0 ELSE @number := @number + 1 

END RANK 

FROM TABLE_1 B, (SELECT @number := 0 AS BOO) C 

ORDER BY B.RANK; 

上記のクエリでは、RANK列に0しか生成されません。

私たちは次のようにALTER TABLEとINSERT INTOせずに、一緒にクエリを実行した場合
DATA,RANK 
1,0 
2,0 
3,0 
4,0 
5,0 
NULL,0 

しかし、HeidiSQLは、我々は上記のスクリプトは、テーブル、我々が生成されます

SELECT B.DATA, 

CASE WHEN B.DATA IS NULL THEN 0 ELSE @number := @number + 1 

END RANK 

FROM TABLE_1 B, (SELECT @number := 0 AS BOO) C 

ORDER BY B.RANK; 

を探しているテーブルを返します。お探しですか?

DATA,RANK 
1,1 
2,2 
3,3 
4,4 
5,5 
NULL,0 

なぜALTER TABLE/INSERT INTOが機能しないのでしょうか?

SQLのフィドルがここにあります:内部で

http://sqlfiddle.com/#!9/d2837/2

+0

に参加することは、ここにあなたの質問のタイトルを叫ぶ必要はありません。それはあなたに何かより速く助けを与えることはありません、それは質問を読むことをより困難にします、そして、失礼で、何の理由のためにも怒っているのは面倒です。質問の中のテキストの一部を正しく扱うことができたため、CAPS LOCKが止まっていないことは明らかです。停止してください。ありがとう。 –

+0

なぜDOUBLE ?????? – Strawberry

答えて

0

使用の更新クエリ

select * from bb; 
    +------+ 
    | data | 
    +------+ 
    | 1 | 
    | 2 | 
    | 3 | 
    | NULL | 
    +------+ 
    4 rows in set (0.00 sec) 
    mysql> ALTER TABLE `bb` ADD COLUMN `RANK` DOUBLE NOT NULL AFTER `DATA`; 
    Query OK, 0 rows affected (0.72 sec) 
    Records: 0 Duplicates: 0 Warnings: 0 


    mysql> UPDATE bb INNER JOIN (SELECT B.DATA as data ,CASE WHEN B.DATA IS NULL THEN 0 ELSE @number := @number + 1 END RANK FROM bb B, (SELECT @number := 0 AS BOO) C ORDER BY B.RANK) TT ON TT.DATA=bb.data set bb.rank=TT.rank; 
    Query OK, 3 rows affected (0.04 sec) 
    Rows matched: 3 Changed: 3 Warnings: 0 

    mysql> select * from bb; 
    +------+------+ 
    | data | RANK | 
    +------+------+ 
    | 1 | 1 | 
    | 2 | 2 | 
    | 3 | 3 | 
    | NULL | 0 | 
    +------+------+ 
    4 rows in set (0.00 sec) 
+0

興味深い解決策!しかし、これは、テーブルが幅が広く(数百万行)大きい場合、クエリを遅くするでしょうか? – Chubaka

+0

いいえランク付けロジックに大きな影響はありません –

+0

あなたはうまく動作します –