2016-07-06 5 views
0

У нас есть таблица, TABLE_1:Включить новый рейтинг ошибки столбца

DATA 
1 
2 
3 
4 
5 
NULL 

Мы хотим, чтобы создать столбец RANK на основе данных столбца

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

Ниже наш код:

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; 

Вышеуказанный запрос генерирует только 0 в столбце RANK

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

Однако, если мы просто выполнить запрос по, без изменения таблицы и INSERT INTO как следующий, 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

Не надо орать Ваш вопрос TITLE здесь. Это не поможет вам быстрее, это затрудняет чтение вопроса, и это грубо и раздражает, чтобы быть БЕСПЛАТНЫ без причины. Понятно, что ваш 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

no рейтинговая логика не окажет значительного воздействия –

+0

это работа для вас –