Чтобы найти все страницы от Первой страницы до Последней страницы по идентификатору книги, ПРОКАЧИТЕ номера своих страниц от STRING до INTEGER, затем добавляйте +1 к каждому номеру страницы, пока не достигнете последней страницы.
Сначала превратите исходную таблицу в переменную таблицы с типами данных Integer, используя TRY_CAST.
DECLARE @Book TABLE (
[ID] INT
,[FirstPage] INT
,[LastPage] INT
)
INSERT INTO @Book
SELECT [ID]
,TRY_CAST(RIGHT([FirstPage], 3) AS int) AS [FirstPage]
,TRY_CAST(RIGHT([LastPage], 3) AS int) AS [LastPage]
FROM [YourOriginalTable]
Установите максимальную страницу, на которую ваши страницы будут увеличиваться, используя переменную. Это сведет ваши результаты к правильному количеству страниц. В противном случае в вашей таблице будет гораздо больше строк, чем вам нужно.
DECLARE @LastPage INT
SELECT @LastPage = MAX([LastPage]) FROM @Book
Для преобразования таблицы из трех столбцов (ID, Первая страница, Последняя страница) в таблицу из двух столбцов (ID, Страница) потребуется UNPIVOT.
Мы заправляем этот UNPIVOT в CTE (Общее выражение таблицы: в основном, умная версия временной таблицы (например, #TempTable или @TableVariable, но которую вы можете использовать только один раз, и в некоторых случаях она немного более эффективна) обстоятельства).
В дополнение к UNPIVOT ваших столбцов [Имя] и [Фамилия] в большую таблицу, мы собираемся добавить любую другую комбинацию номера страницы для каждого идентификатора, используя UNION ALL.
;WITH BookCTE AS (
SELECT [ID]
,[Page]
FROM (SELECT [ID]
,[FirstPage]
,[LastPage]
FROM @Book) AS bp
UNPIVOT
(
[Page] FOR [Pages] IN ([FirstPage], [LastPage])
) AS up
UNION ALL
SELECT [ID], [Page] + 1 FROM BookCTE WHERE [Page] + 1 < @LastPage
)
Теперь, когда ваши данные хранятся в формате таблицы с использованием CTE со всеми комбинациями [ID] и [Page] вплоть до максимальной страницы в вашей таблице @Book, пришло время объединить ваш CTE с таблицей @Book.
SELECT DISTINCT
cte.ID
,cte.Page
FROM BookCTE AS cte
INNER JOIN @Book AS bk
ON bk.ID = cte.ID
WHERE cte.Page <= bk.[LastPage]
ORDER BY
cte.ID
,cte.Page
OPTION (MAXRECURSION 10000)
Смотри также:
Примечание: обновится с повторной интеграцией строковой части FirstPage и LastPage (что, как я полагаю, основано на названии книги). Ожидание.