Кто получит разницу между двумя идентификаторами как одну и ту же структуру

#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, чтобы охватить более высокую последовательность.