Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Рекурсия по одной таблице, а данные с другой  [new]
RKam
Member

Откуда:
Сообщений: 18
Плиз помогите написать запрос - рекурсия по одной таблице, а данные с другой

Нужно найти Документ по номеру, затем трассировать все операции с подтягиванием данных по Entry No. из другой таблицы

Т.е. из двух таблиц при поиске по номеру документа sdoc056 должны получить результат:
Entry No. Document No. Customer/Vendor No.
566 sdoc056 c00234
123 19 tdoc045
123 12 tdoc045
19 pdoc001
12 idoc001

Первая таблица, идем по ней:
Entry No. Init Entry No. Document No.
12 idoc001
19 pdoc001
34 67 sdoc003
45 pdoc002
123 12 tdoc045
123 19 tdoc045
234 45 sdoc023
566 123 sdoc056

Вторая таблица, left join
Entry No. Document No. Customer/Vendor No.
12 idoc001
19 pdoc001 v00002
34 sdoc003 c00023
45 pdoc002 v00007
123 tdoc045 c00027
234 sdoc023 c00345
566 sdoc056 c00234
11 авг 13, 10:59    [14693011]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
qwerty112
Guest
RKam
Плиз помогите написать запрос - рекурсия по одной таблице, а данные с другой

Нужно найти Документ по номеру, затем трассировать все операции с подтягиванием данных по Entry No. из другой таблицы

Т.е. из двух таблиц при поиске по номеру документа sdoc056 должны получить результат:
Entry No. Document No. Customer/Vendor No.
566 sdoc056 c00234
123 19 tdoc045
123 12 tdoc045
19 pdoc001
12 idoc001


Первая таблица, идем по ней:
Entry No. Init Entry No. Document No.
12 idoc001
19 pdoc001
34 67 sdoc003
45 pdoc002
123 12 tdoc045
123 19 tdoc045
234 45 sdoc023
566 123 sdoc056


Вторая таблица, left join
Entry No. Document No. Customer/Vendor No.
12 idoc001
19 pdoc001 v00002
34 sdoc003 c00023
45 pdoc002 v00007
123 tdoc045 c00027
234 sdoc023 c00345
566 sdoc056 c00234

соедени таблицы джойном и будет и рекурсия и данные по/в одной таблице
11 авг 13, 11:52    [14693075]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
RKam
Member

Откуда:
Сообщений: 18
qwerty112,


Чет туплю, не получается, у меня входной параметр - Документ Но.

если я пишу:
SELECT        ile.[Document No_], ile.[Posting Date], iae.[Item Ledger Entry No_], ile.[Entry No_], iae.[Inbound Item Entry No_]
FROM  dbo.[Item Ledger Entry] AS ile LEFT OUTER JOIN
         dbo.[Item Application Entry] AS iae ON ile.[Entry No_] = iae.[Item Ledger Entry No_] LEFT OUTER JOIN
WHERE  (ile.[Document No_] = 'ПРНК-12-00338')


Выводит данные только по одному документу:
ПРНК-12-00338 2012-11-16 00:00:00.000 2382 2382 163 2382
ПРНК-12-00338 2012-11-16 00:00:00.000 2383 2383 535 2383
ПРНК-12-00338 2012-11-16 00:00:00.000 2383 2383 2366 2383
ПРНК-12-00338 2012-11-16 00:00:00.000 2384 2384 534 2384
ПРНК-12-00338 2012-11-16 00:00:00.000 2384 2384 2367 2384

Как сделать так, чтобы пошла рекурсия по связке iae.[Item Ledger Entry No_] = iae.[Inbound Item Entry No_] в таблице [Item Application Entry] по ходу выборки подтягивалась информация из таблицы [Item Ledger Entry] ?
11 авг 13, 13:12    [14693162]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
qwerty112
Guest
RKam
Как сделать так, чтобы пошла рекурсия по связке iae.[Item Ledger Entry No_] = iae.[Inbound Item Entry No_] в таблице [Item Application Entry] по ходу выборки подтягивалась информация из таблицы [Item Ledger Entry] ?

что бы "пошла рекурсия" - нужно написать рекурсивное CTE
где оно у вас ?
11 авг 13, 13:15    [14693163]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
RKam
Member

Откуда:
Сообщений: 18
рекурсивное CTE - подскажи как в это СТЕ поставить селект из другой таблицы?
11 авг 13, 14:35    [14693247]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
qwerty112
Guest
RKam
рекурсивное CTE - подскажи как в это СТЕ поставить селект из другой таблицы?


;with
cte1 as (select ... from t1 inner join t2 ...),

cte2 as (

select ...
from cte1
where ...

union all

select ...
from cte2 inner join cte1 ...
)
11 авг 13, 14:40    [14693255]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
RKam
Member

Откуда:
Сообщений: 18
qwerty112,

Блин, ошибку допустил, в первой таблице нет поля Документ номер.
и скрипт не получается...

Как я понял, сначала делаю выборку
ПРНК-12-00338 2012-11-16 00:00:00.000 2382 2382 163 2382
ПРНК-12-00338 2012-11-16 00:00:00.000 2383 2383 535 2383
ПРНК-12-00338 2012-11-16 00:00:00.000 2383 2383 2366 2383
ПРНК-12-00338 2012-11-16 00:00:00.000 2384 2384 534 2384
ПРНК-12-00338 2012-11-16 00:00:00.000 2384 2384 2367 2384

затем поочередно Entry No взять за старт в СТЕ

Плиз, где поправить?

WITH 

cte1 as (SELECT  ile.[Document No_], ile.[Posting Date], ile.[Entry No_], ile.[Location Code], ile.Quantity,iae.[Item Ledger Entry No_], iae.[Inbound Item Entry No_], iae.[Outbound Item Entry No_]
 FROM dbo.[Керамика оптторг$Item Ledger Entry] AS ile inner join
  dbo.[Керамика оптторг$Item Application Entry] AS iae ON ile.[Entry No_] = iae.[Item Ledger Entry No_]
						 WHERE (ile.[Document No_] = 'ПРНК-12-00338')
 ),

 cte2 as (

select [Posting Date],[Entry No_],[Inbound Item Entry No_] ,[Item Ledger Entry No_]
from dbo.[Керамика оптторг$Item Application Entry] AS iae WHERE ile.[Entry No_] = iae.[Item Ledger Entry No_] and [Inbound Item Entry No_] = [Item Ledger Entry No_]

union all

select cte2.[Posting Date],cte2.[Entry No_],cte2.[Inbound Item Entry No_] ,cte2.[Item Ledger Entry No_]
from cte2 inner join cte1 ON cte2.[Inbound Item Entry No_] = cte2.[Item Ledger Entry No_]

)
--SELECT * FROM CTE1
SELECT * FROM cte2
11 авг 13, 15:28    [14693363]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
qwerty112
Guest
RKam,

>> Как я понял, сначала делаю выборку

нет, в cte1 - просто джойн таблиц без условий
а условие нужно в "якоре" рекурсивного запроса
cte2 as (

select ...
from cte1
where cte1.[Document No_] = 'ПРНК-12-00338'

union all

select ...
from cte2 inner join cte1 ...
)
11 авг 13, 15:41    [14693395]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
RKam
Member

Откуда:
Сообщений: 18
qwerty112,

>>нет, в cte1 - просто джойн таблиц без условий
у меня там пара мил записей, это не выход

А можно как то так сделать? (могу словами, буду благодарен за скрипт -):
SELECT  ile.[Entry No_]
 FROM dbo.[Керамика оптторг$Item Ledger Entry] AS ile 
	WHERE ile.[Document No_] = 'ПРНК-12-00338' group by ile.[Entry No_]		


Получаю Entry No.:
2382
2383
2384

Затем цикл по этим строкам для поиска в таблице [Item Application Entry] где [Inbound Item Entry No_] = cte1.[Entry No_] и далее рекурсив cte2.[Item Ledger Entry No_] >> cte2.[Inbound Item Entry No_] см картинку

К сообщению приложен файл. Размер - 44Kb
11 авг 13, 16:11    [14693463]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
eewedewde
Guest
RKam,

приведи данные в форме

with t1(c1, c2, ... as
(
...
)

а то из тех огрызков вверху ничего не понятно и результат что надо получить на этих данных. потрать на это время. быстрее ответят. с удовольствием возьмусь за решение.
11 авг 13, 16:19    [14693473]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
qwerty112
Guest
RKam
qwerty112,

>>нет, в cte1 - просто джойн таблиц без условий
у меня там пара мил записей, это не выход

и что ?
11 авг 13, 16:20    [14693475]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
RKam
Member

Откуда:
Сообщений: 18
qwerty112
RKam
qwerty112,

>>нет, в cte1 - просто джойн таблиц без условий
у меня там пара мил записей, это не выход

и что ?


Время выполнения... или тут не будет делаться полный селект 2-х таблиц?
11 авг 13, 16:35    [14693514]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
RKam
Member

Откуда:
Сообщений: 18
qwerty112
RKam
Не смогу найти кнопки Редактировать сообщение, поэтому столько косяков.

Уточнил условие и данные:

Есть номер документа по которому нужно найти все примененные записи.

Т.е. по номеру документа sdoc056 должны получить результат:
Entry No. Document No. Customer/Vendor No.
566 sdoc056 c00234
123 tdoc045 c00027
123 tdoc045 c00027
19 pdoc001 v00002
12 idoc001


Первая таблица, в ней номер и номер исходной операции:
Entry No. Init Entry No.
12
19
34 67
45
123 12
123 19
234 45
566 123


Вторая таблица, из которой нужно подтянуть Document No. по полю Entry No. из первой таблицы:
Entry No. Document No. Customer/Vendor No.
12 idoc001
19 pdoc001 v00002
34 sdoc003 c00023
45 pdoc002 v00007
123 tdoc045 c00027
234 sdoc023 c00345
566 sdoc056 c00234

соедени таблицы джойном и будет и рекурсия и данные по/в одной таблице
11 авг 13, 17:43    [14693629]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
qwerty112
Guest
RKam,

+
declare @t1 table([Entry No.] int, [Init Entry No.] int)
declare @t2 table([Entry No.] int, [Document No.] varchar(10), [Customer/Vendor No.] varchar(10))

insert into @t1  
select 12, null union all   
select 19, null union all  
select 34,  67  union all
select 45, null union all
select 123,  12 union all
select 123,  19 union all
select 234,  45 union all
select 566,  123

insert into @t2
select 12,  'idoc001', null      union all
select 19,  'pdoc001',  'v00002' union all
select 34,  'sdoc003',  'c00023' union all
select 45,  'pdoc002',  'v00007' union all 
select 123,  'tdoc045',  'c00027' union all
select 234,  'sdoc023',  'c00345' union all
select 566,  'sdoc056',  'c00234' 


;with cte as (
select t2.[Entry No.], t1.[Init Entry No.]
from @t1 t1 inner join @t2 t2 on t1.[Entry No.]=t2.[Entry No.]
where t2.[Document No.]='sdoc056'

union all

select t1.[Entry No.], t1.[Init Entry No.]
from @t1 t1 inner join cte on t1.[Entry No.]=cte.[Init Entry No.] )

select t2.* 
from @t2 t2 inner join cte on t2.[Entry No.]=cte.[Entry No.]

Entry No.   Document No. Customer/Vendor No.
----------- ------------ -------------------
566         sdoc056      c00234
123         tdoc045      c00027
123         tdoc045      c00027
19          pdoc001      v00002
12          idoc001      NULL
11 авг 13, 18:00    [14693657]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
RKam
Member

Откуда:
Сообщений: 18
qwerty112,

Большое спасибо, заработало!
11 авг 13, 18:32    [14693718]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по одной таблице, а данные с другой  [new]
RKam
Member

Откуда:
Сообщений: 18
RKam,

Еще одна проблемка возникла - иногда зацикливается, причина в одинаковых Entry No., проверить не могу, т.к. если смотреть из цикла то я вижу только последний номер, а повторяющийся идет предпоследним

Есть ли возможность забирать только уникальные Entry No. или в цикле как то проверить Entry No. на повторение

.....
union all
select IAE.[Entry No_], IAE.Quantity as QTY
from [Item Application Entry] IAE inner join AI
 on
 IAE.[Inbound Item Entry No_] = AI.[Item Ledger Entry No_]
where IAE.[Item Ledger Entry No_] <> AI.[Item Ledger Entry No_] здесь бы проверить Entry No. не записан ли ранее
....
18 авг 13, 13:22    [14722960]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить