У меня есть такая таблица:
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
Майскл? Tsql? SQL-сервер? Выбери один! Mysql и SQL Server не имеют общего диалекта sql.
С этим можно легко справиться, используя подход календарной таблицы с 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;
но мой номер больше 10000, мой идентификатор вроде - 25645845651, пытался добавить (10000 * tenthousands.n), как я могу добавить больше, спасибо @tim
Затем расширьте CTE, чтобы охватить более высокую последовательность.
Вы можете использовать рекурсивное общее табличное выражение (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;
Я ПОЛУЧИЛ ОШИБКУ MAXRECURSION, Я ПЫТАЛСЯ УСТАНОВИТЬ (ВАРИАНТ (MAXRECURSION 0). НО НЕ РАБОТАЕТ ....... СПАСИБО @PETER
Это решение действительно не подходит, когда вы ожидаете так много записей. (не надо кричать)
NB: Я полагаю,
id_begain
должно бытьid_begin
?