Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
qwerty112
Guest |
соедени таблицы джойном и будет и рекурсия и данные по/в одной таблице |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11 авг 13, 11:52 [14693075] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
qwerty112
Guest |
что бы "пошла рекурсия" - нужно написать рекурсивное CTE где оно у вас ? |
||
11 авг 13, 13:15 [14693163] Ответить | Цитировать Сообщить модератору |
RKam Member Откуда: Сообщений: 18 |
рекурсивное CTE - подскажи как в это СТЕ поставить селект из другой таблицы? |
11 авг 13, 14:35 [14693247] Ответить | Цитировать Сообщить модератору |
qwerty112
Guest |
;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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
eewedewde
Guest |
RKam, приведи данные в форме with t1(c1, c2, ... as ( ... ) а то из тех огрызков вверху ничего не понятно и результат что надо получить на этих данных. потрать на это время. быстрее ответят. с удовольствием возьмусь за решение. |
11 авг 13, 16:19 [14693473] Ответить | Цитировать Сообщить модератору |
qwerty112
Guest |
и что ? |
||
11 авг 13, 16:20 [14693475] Ответить | Цитировать Сообщить модератору |
RKam Member Откуда: Сообщений: 18 |
Время выполнения... или тут не будет делаться полный селект 2-х таблиц? |
||||
11 авг 13, 16:35 [14693514] Ответить | Цитировать Сообщить модератору |
RKam Member Откуда: Сообщений: 18 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11 авг 13, 17:43 [14693629] Ответить | Цитировать Сообщить модератору |
qwerty112
Guest |
RKam,
;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] Ответить | Цитировать Сообщить модератору |
RKam Member Откуда: Сообщений: 18 |
qwerty112, Большое спасибо, заработало! |
11 авг 13, 18:32 [14693718] Ответить | Цитировать Сообщить модератору |
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 | ![]() |