Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
minva Member Откуда: г. Калуга Сообщений: 1209 |
Есть табличка в которой храниться информация по выданным клиенту пачке(ID_Pack) карточек. Указывается диапазон номеров, который выдан - поля FirstNumber и LastNumber. Есть таблица, в которой заносится каждая карточка со своим номером, номером пачки и когда использована. (CardNumber, ID_Pack, UseDate) Реально построить запрос, чтоб получить номера карточек, которые еще не были использованы? Я так понимаю, что из полей FirstNumber и LastNumber надо как-то временную таблицу сварганить, но как? |
7 ноя 13, 14:16 [15090989] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Реально. Как тока вы скажете, что является признаком "карточки, которая еще не была использована". |
||
7 ноя 13, 15:25 [15091441] Ответить | Цитировать Сообщить модератору |
Престарелый заяц
Guest |
Declare @D table(Id int identity( 1, 1 ),NStart int, NEnd int) Declare @Vid table(Id int, Num int) Insert into @D values (1,10), (50,100) Insert into @Vid Values (1, 5), (1 ,7), (2, 55), (2, 56) ;With cte as ( Select Id, Nstart as Num,NEnd from @D union all Select Id, Num + 1 Num,NEnd from CTE where Num+1<=NEnd ) select Id,Num from cte where Num not in (select Num from @Vid v Where v.Id = cte.Id) order by Id,Num Где то так ? |
7 ноя 13, 15:28 [15091477] Ответить | Цитировать Сообщить модератору |
minva Member Откуда: г. Калуга Сообщений: 1209 |
aleks2, её номера нет в таблице использованных |
7 ноя 13, 15:36 [15091596] Ответить | Цитировать Сообщить модератору |
minva Member Откуда: г. Калуга Сообщений: 1209 |
Престарелый заяц, спасибо! |
7 ноя 13, 15:39 [15091646] Ответить | Цитировать Сообщить модератору |
minva Member Откуда: г. Калуга Сообщений: 1209 |
Престарелый заяц, А можно немного пояснить как это работает? пусть Insert into @D values (1,10), (1,20) Делаю запрос select Id,Num,NEnd from cte получаю 1,1,10 2,1,20 2,2,20 2,3,20 .... 1,2,10 ... первые две строки понятно откуда взялись, в вот почему третья начинается с ID=2, а не с 1? |
7 ноя 13, 15:59 [15091896] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Если в запросе нет ORDER BY, то порядок выдачи строк не гарантирован и теоретически может быть любым. |
||
7 ноя 13, 16:03 [15091940] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Престарелым зайцам пора на пензию.Declare @D table(Id int identity( 1, 1 ),NStart int, NEnd int) Declare @Vid table(Id int, Num int) Insert into @D values (1,10), (50,100) Insert into @Vid Values (1, 5), (1 ,7), (2, 55), (2, 56) ; with x as ( select Num from @Vid v1 where not exists(select * from @Vid v2 where v2.Num = v1.Num +1 ) and v1.Num < (select max(Num) from @Vid) union select Num from @Vid v1 where not exists(select * from @Vid v2 where v2.Num = v1.Num -1 ) and v1.Num > (select min(Num) from @Vid) ), y as (select *, ROW_NUMBER() over(Order by Num) n from x) select y1.Num+1 [from], y2.Num-1 [to] from y y1 inner join y y2 on y1.n+1 = y2.n |
7 ноя 13, 16:16 [15092097] Ответить | Цитировать Сообщить модератору |
Престарелый заяц
Guest |
2Aleks Вы, вроде бы, немного не то выбираете не то, что нужно ТС. |
7 ноя 13, 19:03 [15093391] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
minva, По сути, классическая задача. :) Решается посредством преобразования интервалов в точки, с последующим собиранием из точек новых интервалов. Если версия сервера позволяет, то LEAD/LAG тут будет очень к месту. |
8 ноя 13, 05:26 [15095024] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Я выбираю лучше. Тредстартер просто ишо не дорос до понимания. |
||
8 ноя 13, 06:44 [15095077] Ответить | Цитировать Сообщить модератору |
LexusR Member Откуда: Novosibirsk Сообщений: 1887 |
Я бы не был столь категоричен. Постановка задачи ТС ("Реально построить запрос, чтоб получить номера карточек, которые еще не были использованы?") допускают двоякое толкование. Если учесть что существует таблица ВЫДАННЫХ диапазонов то толкование Престарелого Зайца более вероятно.ИМХО |
||||
8 ноя 13, 07:13 [15095094] Ответить | Цитировать Сообщить модератору |
minva Member Откуда: г. Калуга Сообщений: 1209 |
LexusR, вы правы. Заяц сделал именно то, что нужно. Тем более я потом уточнил, задачу. |
8 ноя 13, 09:45 [15095447] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |