SQL Server: столбец со 100 строками, организованный повторением A-Z?

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я хочу создать таблицу, содержащую 100 строк, а первый столбец организован буквами от А до Я и повторяется до 100. Самое близкое, к чему я пришел, это либо:

  1. наличие числового столбца, который затем использует значения ASCII для преобразования числа в букву, однако для этого сначала создается числовой столбец, а затем на основе него создается столбец алфавита, или

  2. Мне удалось создать один столбец, однако, когда я пытаюсь распечатать всю таблицу, она отображается как AAAA, BBBB, CCCC, DDDD и т.д.

Мне нужно, чтобы столбец был полностью независимым, поэтому решение № 1 не работает, и я не могу найти способ правильно отсортировать или организовать решение № 2, чтобы оно было A, B, C вместо того, как оно печатается сейчас. Скриншоты для контекста:

Решение 1

Решение 2

Я использовал этот код для создания таблицы:

 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