SQL-запрос для замены нескольких совпадающих строк на новую строку - PullRequest
1 голос
/ 03 октября 2011

Для простоты предположим, что у меня есть таблица SQL с одним столбцом, содержащим числовые данные. Пример данных

11
13
21
22
23
3
31
32
33
41
42
131
132
133
141
142
143

Если таблица содержит ВСЕ числа в форме x1, x2, x3, но НЕ x (где x - все цифры числа, кроме последней цифры. Таким образом, для 123456, x будет 12345), тогда я хочу заменить эти три строки новой строкой, х.

Желаемый результат вышеприведенных данных будет:

11
13
2
3
31
32
33
41
42
131
132
133
14

Как бы я сделал это с помощью SQL? Я должен отметить, что я не хочу постоянно изменять данные - только для результатов запроса. Спасибо.

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Я предполагаю

  • наличие функций: lastDigit и head, производящих последнюю цифру и оставшуюся часть входного значения соответственно

  • данные уникальны

  • только цифры 1,2,3 используются для построения значений таблицы

  • таблицас именем t и имеет один столбец x

  • вы не хотите, чтобы это работало рекурсивно

  • создайте представление n вот так: select head(x) h, lastDigit(x) last from t Вместо этого вы можете использовать встроенные представления

  • создать представление c следующим образом

    выбрать h из n групп по h, имеющему count (*) =3

Тогда это должно дать желаемый результат:

select distinct x 
from (
    select x from t where head(x) not in (select h from c)
    union
    select h from c
)
0 голосов
/ 03 октября 2011

Вам нужны две команды SQL: одна для удаления существующих строк, а вторая для добавления новой строки. Они бы выглядели так (где :X - это параметр, содержащий ваш базовый номер, 14 в вашем примере):

 DELETE FROM YourTable WHERE YourColumn BETWEEN (:X*10) AND ((:X*10) + 9)

 INSERT INTO YourTable (YourColumn) VALUES (:X)

Примечание: я предполагаю, что вы хотите, чтобы все числа от x0 до x9 были удалены, вот что я написал выше. Если вы действительно хотите удалить только x1, x2, x3, используйте вместо этого оператор DELETE:

 DELETE FROM YourTable WHERE YourColumn BETWEEN ((:X*10) + 1) AND ((:X*10) + 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...