#sql #sql-server #tsql #ssms-2014
#sql #sql-сервер #tsql #ssms-2014
Вопрос:
У меня есть таблица, подобная этой:
id_begain | id_end | name | address | m_number
---------- -------- ------ --------- -----------
1 | 5 | a | hyd | 099
7 | 9 | b | pne | 999
200 | 288 | c | bng | 1999
Мне нужен вывод, подобный этому:
id name address m_number
----------------------------
1 a hyd 099
2 a hyd 099
3 a hyd 099
4 a hyd 099
5 a hyd 099
7 b pne 999
8 b pne 999
9 b pne 999
200 c bng 1999
201 c bng 1999
...
288 c bng 1999
Комментарии:
1. Примечание: Я полагаю,
id_begain
должно бытьid_begin
?2. Mysql? Tsql? Sql server? Выберите один! Mysql и SQL Server не используют общий диалект sql.
Ответ №1:
Вы могли бы использовать рекурсивное общее табличное выражение ( tbl
это ваша таблица):
with cte as (
select id_begin, id_end, name, address, m_number
from tbl
union all
select id_begin 1, id_end, name, address, m_number
from cte
where id_begin < id_end
)
select id_begin as id, name, address, m_number
from cte
order by 1;
Комментарии:
1. Я ПОЛУЧИЛ ОШИБКУ MAXRECURSION, я ПОПЫТАЛСЯ УСТАНОВИТЬ (OPTION (MAXRECURSION 0). НО НЕ УДАЛОСЬ……. СПАСИБО @PETER
2. Это решение действительно не подходит для случаев, когда вы ожидаете так много записей. (не нужно кричать)
Ответ №2:
Это может быть легко обработано с использованием подхода таблицы календаря, с CTE, содержащим последовательность всех чисел, которые могут отображаться в ваших начальных или конечных столбцах:
WITH numbers AS (
SELECT ones.n 10*tens.n 100*hundreds.n 1000*thousands.n AS id
FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n)
WHERE ones.n 10*tens.n 100*hundreds.n 1000*thousands.n BETWEEN 1 AND 10000
)
SELECT
t1.id,
t2.name,
t2.address,
t2.m_number
FROM numbers t1
INNER JOIN yourTable t2
ON t1.id BETWEEN t2.id_begain AND t2.id_end
ORDER BY
t1.id;
Комментарии:
1. но мой номер больше 10000, мой идентификатор, подобный — 25645845651, пытался добавить (10000 * десятых тысяч.n) как я могу добавить больше, чем это, спасибо @tim
2. Затем расширьте CTE, чтобы охватить более высокую последовательность.