#sql #sql-server
#sql #sql-сервер
Вопрос:
Я хочу создать таблицу, содержащую 100 строк, а первый столбец организован буквами от А до Я и повторяется до 100. Самое близкое, к чему я пришел, это либо:
-
наличие числового столбца, который затем использует значения ASCII для преобразования числа в букву, однако для этого сначала создается числовой столбец, а затем на основе него создается столбец алфавита, или
-
Мне удалось создать один столбец, однако, когда я пытаюсь распечатать всю таблицу, она отображается как AAAA, BBBB, CCCC, DDDD и т.д.
Мне нужно, чтобы столбец был полностью независимым, поэтому решение № 1 не работает, и я не могу найти способ правильно отсортировать или организовать решение № 2, чтобы оно было A, B, C вместо того, как оно печатается сейчас. Скриншоты для контекста:
Я использовал этот код для создания таблицы:
SELECT n
FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)
)
SELECT n1.n n10.n * 10 as col
INTO dbo.table1
FROM nums n1
CROSS JOIN nums n10;
Затем для решения 1 я попробовал это:
ALTER TABLE numbers
ADD letters AS CHAR(num % 26 65);
SELECT * FROM numbers
ORDER BY num;
и для решения 2 это:
ALTER TABLE table1
ALTER COLUMN col VARCHAR(3);
UPDATE table1
SET col = col % 26 65;
UPDATE table1
SET col = CHAR(col);
SELECT * FROM table1
ORDER BY col;
Я занимаюсь этим уже несколько часов, пробуя разные вещи в обоих решениях, чтобы получить ответ.
Заранее спасибо.
Комментарии:
1. Можете ли вы показать таблицу, которую хотите создать?
2. Какое значение вы хотите после
Z
?3. Из того, что я могу сказать, вы хотели бы таблицу из 1 столбца только с буквами (без другого счетчика int / PK), а затем отсортировать A-B-C … Y-Z-A-B … Y-Z- etc? Это проблематично, поскольку данные в базе данных изначально не отсортированы; они становятся значимыми только при использовании, когда вы явно сортируете их. Поэтому в этом случае вы могли бы создать таблицу с (в основном) по 4 каждого символа, но она не будет по своей сути отсортирована каким-либо образом. Ваше собственное решение 1 является лучшим ответом на это, поскольку оно имеет значение, по которому вы можете сортировать (обратите внимание, конечно, что их не обязательно выполнять в таблице — это можно сделать как 1 select с помощью подзапроса)
Ответ №1:
Если вы хотите многократно перебирать генерируемые буквы, вы можете использовать рекурсивный CTE:
with cte as (
select convert(varchar(max), 'A') as letter, 1 as n
union all
select (case when letter < 'Z' then convert(varchar(max), char(ascii(letter) 1)) else 'A' end),
n 1
from cte
where n < 100
)
select letter
from cte;
Вы можете использовать insert
или select into
для размещения значений в таблице.
Если вам нужно больше 100 строк, вам нужно добавить option (maxrecursion 0)
.
Ответ №2:
В таблице нет определенного порядка строк. Даже если в таблице указан кластеризованный индекс. Такой концепции не существует в реляционных базах данных. Чтобы обеспечить определенный порядок значений, вам необходимо принудительно использовать предложение ORDER BY в инструкции SELECT . Учитывая это, следующий код должен дать вам представление о том, как реализовать ваше решение:
With nums as (
SELECT n
FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)
),
numbers as (
SELECT n1.n n10.n * 10 as num
FROM nums n1
CROSS JOIN nums n10
)
select num, char(num/26 65) CHAR(num % 26 65)
from numbers
order by num