Как заполнить таблицу без использования курсора в SQL Server 2008 R2 - PullRequest
1 голос
/ 22 ноября 2011

Мне нужно идентифицировать недостающие продукты, номера которых являются последовательными.Другими словами, есть набор продуктов, каждый из которых продается с уникальным номером в каждом из наших магазинов.Конечный пользователь хочет получить отчет, в котором будут указаны недостающие виджеты в диапазоне дат.

Store   Product Number
Store 1  Widget   100
Store 1  Widget   101
Store 1  Widget   102
Store 1  Widget   104
Store 2  Widget   201
Store 2  Widget   202
Store 2  Widget   203

Я подумал, что лучший способ сделать это - получить MAX (число) и MIN (число), а затем заполнить табличную переменную всеми числами в последовательности.Если номер виджета из табличной переменной не существует в таблице Product, я бы вернул номер и пометил его как отсутствующий.

Однако;наш DBA очень сильно против Cursors, и я знаю, что циклы WHILE требуют много времени.Кроме того, я не уверен, как это сделать для каждого отдельного магазина.

Кто-нибудь знает способ сделать это на основе набора?поэтому, когда вы продаете виджет № 1, следующий виджет, который вы продаете, должен быть виджетом № 2.Тем не мение;иногда этого не происходит, и виджет № 3 продается - виджет № 2 отсутствует и отсутствует в базе данных.Мне нужно указать в отчете, что виджеты № 1 и № 3 были проданы, а № 2 отсутствует.

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Обновленный ответ

Пример кода для создания таблицы и рабочего решения приведен ниже. В основном вы делаете 2 EXISTS проверок - чтобы увидеть, есть ли числа выше, чем текущее число, и нет номера на одно число выше текущего числа.

DECLARE @t Table (Store int, Product varchar(100), number int)
INSERT INTO @t
VALUES
(1, 'Widget',   100),
(1, 'Widget',   101),
(1, 'Widget',   102),
(1, 'Widget',   104),
(2, 'Widget',   201),
(2, 'Widget',   202),
(2, 'Widget',   203)

SELECT Store, Product, t.Number+1 as Missing
FROM @t t
WHERE EXISTS (SELECT 1 FROM @t t2
              WHERE t2.Store = t.Store
              AND t2.product = t.product
              AND t2.number > t.number)
AND Not Exists (SELECT 1 FROM @t t3
                WHERE t3.Store = t.store
                AND t3.product = t.product
                AND t3.number = t.number + 1)
0 голосов
/ 22 ноября 2011

Создайте таблицу чисел и заполните ее большим количеством чисел, чем вам нужно.Затем вы можете использовать запрос на основе набора для получения результатов

Create table #temp (product varchar(15), id int)
insert into #temp
values ('test', 1), ('test', 3),('test', 4),('test2', 6),('test2', 2),('test2', 10),('test3', 10),('test3', 9),('test3',7),('test4', 1),('test4', 2),('test4', 3)

create table #product (product varchar (15))
insert into #product 
values ('test'),('test2'),('test3'),('test4'), ('test5')
create table #num (number int)

insert into #num
values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15)

select n.number,p.product from #num n
cross join #product p 
left join (
select product, max(id)as maxid from #temp group by product)a
on a.product = p.product 
left join #temp t on n.number = t.id and t.product = p.product
where  n.number <=a.maxid and t.id is null
order by p.product
...