Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сложный запрос без курсоров? / 11 сообщений из 11, страница 1 из 1
16.08.2002, 18:24:20
    #32044038
Denisco
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложный запрос без курсоров?
У меня такой вопрос:
есть табличка t_rest (Сток), есть таблица t_OrderItems(Строки Накладной), мне нужно написать запрос который бы обновлял табл Сток или добавлляет данные в неё данные в зависимости от наличия совпадений с таблицей t_OrderItems (если совпадений нет то добавляет, а если есть то обновляет), как сделать это при помощи SQL? Я написал такой запрос, но он не работает что то..

insert into t_rest
select * from t_OrderItems where t_OrderItems.OrderId=18
and t_rest.NameId not in (select NameId from t_OrderItems where OrderId=18)
and t_rest.Invoice not in (select Invoice from t_OrderItems where OrderId=18)

update t_rest set t_rest.Qnty=t_rest.Qnty-t_OrderItems.Qnty
from t_OrderItems where t_OrderItems.OrderId=18
and t_rest.NameId=t_OrderItems.NameId and t_rest.invoice=t_OrderItems.Invoice
and t_rest.Qnty>=t_OrderItems.Qnty

Server: Msg 107, Level 16, State 3, Line 1
The column prefix 't_rest' does not match with a table name or alias name used in the query.
Server: Msg 107, Level 16, State 1, Line 1
The column prefix 't_rest' does not match with a table name or alias name used in the query.
(Часть запроса для обновления работает)
Может есть у кого какие мысли?
...
Рейтинг: 0 / 0
16.08.2002, 18:40:58
    #32044042
Rom
Rom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложный запрос без курсоров?
похоже у тебя нет такой таблицы t_rest
...
Рейтинг: 0 / 0
16.08.2002, 18:43:07
    #32044043
Vasiliy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложный запрос без курсоров?
go
DECLARE @Qnty int, @NameId Int
SET @Qnty=0
SET @NameId =0

SELECT TOP 1 @NameId =t_OrderItems.NameId
@Qnty=t_OrderItems.Qnty
FROM t_OrderItems
WHERE (t_OrderItems.OrderId=18)
ORDER BY t_OrderItems.NameId

WHILE @@rowcount > 0
BEGIN

-- здесь пишешь свой код изменения остатков, используя переменные @Qnty и @NameId

SELECT TOP 1 @NameId =t_OrderItems.NameId
@Qnty=t_OrderItems.Qnty
FROM t_OrderItems
WHERE (t_OrderItems.OrderId=18) AND
(t_OrderItems.NameId >@NameId )
ORDER BY t_OrderItems.NameId
END

go

Должно работать быстрее курсора
...
Рейтинг: 0 / 0
16.08.2002, 18:51:52
    #32044045
Denisco
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложный запрос без курсоров?
Не очень надежно вызывать @@rowcount в такой ответственной вещи как изменене стока (мне так кажется), некоторые тригеры во время своей работы изменяют эту переменную.. Мне интересно где в моем запросе ошибка, он теоритически должен работать -)) Но почему то не работает.. А табличка t_rest там есть, так как вторая часть заброса отрабатывает нормально
...
Рейтинг: 0 / 0
16.08.2002, 18:55:46
    #32044046
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложный запрос без курсоров?
Не, TSQL так не апдэйтит. Нужно делать примерно так:

Код: plaintext
1.
2.
3.
4.
5.
update t_rest set Qnty=t_rest.Qnty-t_OrderItems.Qnty 
from t_rest inner join t_OrderItems 
on t_rest.NameId=t_OrderItems.NameId 
and t_rest.invoice=t_OrderItems.Invoice 
and t_rest.Qnty>=t_OrderItems.Qnty 
where t_OrderItems.OrderId= 18  
...
Рейтинг: 0 / 0
16.08.2002, 18:57:24
    #32044047
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложный запрос без курсоров?
Я не понимаю синтаксиса твоего первого запроса по вставке. Насколько я знаю, синтаксис должен быть таким:

INSERT INTO <куда вставляем> SELECT <что вставляем>

Каким боком в подзапрос заехало имя таблицы в которую идет вставка? Нет, конечно, использовать ее можно, но тогда, как мне кажется, ее следует повторно указать в источниках для подзапроса. Т.е. примерно так:

INSERT INTO t_rest
SELECT ... FROM t_OrderItems,t_rest ...

И как-то связать таблицы t_OrderItems,t_rest (возможно по JOIN)
...
Рейтинг: 0 / 0
16.08.2002, 19:17:13
    #32044050
Denisco
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложный запрос без курсоров?
Торможу товарищи я под вечер -))
insert into t_rest (Qnty, NameId,ScladID,officeid,invoice)
select Qnty,NameId, 17,1,Invoice from t_OrderItems
where t_OrderItems.OrderId=18
and t_OrderItems.Invoice not in (select invoice from t_rest )


update t_rest set t_rest.Qnty=t_rest.Qnty-t_OrderItems.Qnty
from t_OrderItems where t_OrderItems.OrderId=18
and t_rest.NameId=t_OrderItems.NameId and t_rest.invoice=t_OrderItems.Invoice
and t_rest.Qnty>=t_OrderItems.Qnty
Заработало. Хотя мне эта конструкция не нравится..
...
Рейтинг: 0 / 0
16.08.2002, 19:19:10
    #32044051
Vasiliy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложный запрос без курсоров?
insert into t_rest
select * from t_OrderItems where (t_OrderItems.OrderId=18 )
and (t_OrderItems.NameId not in (select NameId from t_rest))
and (t_OrderItems.Invoice not in (select Invoice from t_rest ))

а так сработает ?
...
Рейтинг: 0 / 0
16.08.2002, 19:22:17
    #32044052
Denisco
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложный запрос без курсоров?
Для ВладимирМ,
тут все достаточно запутано, а свзывать с t_OrdersItems нельзя, в сток должны добавлятся записи если в стоке нет товара с таким инвойсом и запись в стоке должна апдэйтится если такая запись есть. Не спрашивайте почему так - так надо -)) Это какие внешнеэкономические лперации.
...
Рейтинг: 0 / 0
16.08.2002, 19:45:19
    #32044057
Denisco
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложный запрос без курсоров?
Во написал, если кому интересно -))
update t_rest set t_rest.Qnty=t_rest.Qnty+t_OrderItems.Qnty
from t_OrderItems where t_OrderItems.OrderId=33
and t_rest.NameId=t_OrderItems.NameId and t_rest.invoice=t_OrderItems.Invoice

insert into t_rest (Qnty, NameId,ScladID,officeid,invoice)
select Qnty,NameId, 17,1,Invoice from t_OrderItems
where t_OrderItems.OrderId=33 and
(t_OrderItems.Invoice not in (select invoice from t_rest )and t_OrderItems.NameId not in (select NameId from t_rest where invoice=t_OrderItems.Invoice ))
...
Рейтинг: 0 / 0
16.08.2002, 19:53:28
    #32044058
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложный запрос без курсоров?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
update t_rest set t_rest.Qnty=t_rest.Qnty+t_OrderItems.Qnty 
from t_OrderItems where t_OrderItems.OrderId= 33  
and t_rest.NameId=t_OrderItems.NameId and t_rest.invoice=t_OrderItems.Invoice 

insert into t_rest (Qnty, NameId,ScladID,officeid,invoice) 
select Qnty,NameId,  17 , 1 ,Invoice from t_OrderItems 
where t_OrderItems.OrderId= 33  and 
not exist(select top  1   1  from where t_OrderItems.Invoice=t_rest.Invoice ) and
not exist(select top  1   1  from t_rest where t_rest.invoice=t_OrderItems.Invoice and  t_rest.NameId=t_OrderItems.NameId ))
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сложный запрос без курсоров? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]