Имя: Пароль:
1C
 
Рекурсия в запросе
0 DRAGO
 
11.03.09
14:27
Можно сделать рекурсию в запросе. Напримерпо затратам, если есть по определенной затрате сведения, то и ее перебирать и т.д.
1 Salvador Limones
 
11.03.09
14:28
Как?
Расскажи!
2 DRAGO
 
11.03.09
14:29
Это вопрос...
3 vde69
 
11.03.09
14:29
(0) нельзя, да и глупость это несусветная...
(1) можно сделать рекурсию в ХП но это то-же глупость будет
4 H A D G E H O G s
 
11.03.09
14:30
(0) Что такое рекурсия?
5 DRAGO
 
11.03.09
14:30
почему глупость. Как же тогда построить отчет? Только перебором?
6 DmitrO
 
11.03.09
14:32
В 8ке нельзя, в MSSQL 2005 можно.
(3) ух ты.. категорично, и очень уверено.. "а мужики-то незнают"
7 vde69
 
11.03.09
14:32
(5) почитай про реляционные базы, про JOIN и т.д.
учи язык запросов
8 Salvador Limones
 
11.03.09
14:32
(2) Блиннн, не увидел в теме знаков вопроса. Думал, ты сейчас мастер-класс рекурсии в запросе покажешь.
9 hhhh
 
11.03.09
14:33
(5) как все отчеты строятся, так и этот построй. Какое отношение рекурсия имеет к отчету. Наверно, ты про расшифровку спрашивал, а не про рекурсию.
10 i-rek
 
11.03.09
14:34
В СКД можно некоторым образом
11 vde69
 
11.03.09
14:35
(6) до 2005 существовал предел на 255 таблиц, это главное было
12 Новиков
 
11.03.09
14:35
в языке запросов рекурсии нет. И слава б-гу!
13 DRAGO
 
11.03.09
14:36
ПРОДУКЦИЯ                            |Сумма
      |                             |
      ---Затрата                    |
                |                   |  
                ----Затрата         |
                          |         |
                           --- .... |

ВО КАК ХОТЯТ ВИДЕТЬ! Все к одному регистру.
14 Sadovnikov
 
11.03.09
14:36
(12) Еще как есть.
15 DRAGO
 
11.03.09
14:38
ну блин намекните хоть как это должно быть
16 Новиков
 
11.03.09
14:38
(15) :) еще как нет
17 Sadovnikov
 
11.03.09
14:39
(16) Ну-ну. BOL полистай.
18 Новиков
 
11.03.09
14:42
в 8-шном языке запросе полистать BOL? Страничку в желтой книжке не подскажешь? :)
19 Sadovnikov
 
11.03.09
14:43
(18) А в восьмерке - язык запросов?? Убожество там, а не запросы.
20 DRAGO
 
11.03.09
14:43
А что такое BOL?
21 Новиков
 
11.03.09
14:44
(19) а автор поста на чем пишет? на T-SQL?
22 Sadovnikov
 
11.03.09
14:44
(20) Books Online
23 Sadovnikov
 
11.03.09
14:45
(21) Вот честно - мне пофиг на чем автор пишет. Ты в (12) про это не уточнял :)
24 DRAGO
 
11.03.09
14:45
Я пишу на языке 8.1. Вопрос повторять?
25 Sadovnikov
 
11.03.09
14:46
(24) Да не обращай внимания. Это мы так, между собой пикировкой увлеклись.
26 Sadovnikov
 
11.03.09
14:47
(24) А по теме - из (0) и (13) абсолютно непонятно чего тебе нужно и в чем именно проблема. Постарайся выдать побольше информации.
27 Новиков
 
11.03.09
14:47
(24) в языке запросов 8.1. рекурсии нет и не было никогда. Товарищ Садовников вещает, что если бы ты лабал на чистом скуле - тогда сии возможности бы теоретически тебе помогли. На практике - сложно сказать.
28 Sadovnikov
 
11.03.09
14:48
(27) "возможности бы теоретически тебе помогли" - э нет. Не писал я такого. Очень сомневаюсь что стоит использовать рекурсию в скуле. Особенно с ее ограничением на 32 уровня вложенности.
29 DRAGO
 
11.03.09
14:48
Продукция состоит из полуфабрикатов, а полуфабрикаты в свою очередь тоже из них и т.д. Нужно перебрать все в глубь и собрать затраты.
30 Новиков
 
11.03.09
14:50
(29) ну что могу сказать - ты столкнулся с классическим вариантам сбора состава изделия. Как говорят обычно - читай мат.часть.

P.s.: для затравки посмотри как собирается состав в УПП.
P.s.2: запросом на языке запросов такую задачу решить проблематично.
31 Sadovnikov
 
11.03.09
14:52
(30) Если бы в восьмерке была бы доступна нормальная работа с временными таблицами и циклами - без проблем бы это решалось. Одним запросом.
32 DRAGO
 
11.03.09
14:53
А куда в УПП для затравки взглянуть.
Так там вроде сделали какую-то работу с временными таблицами...
33 DRAGO
 
11.03.09
14:54
только циклов нет, конечно
34 Sadovnikov
 
11.03.09
14:54
(32) Ключевое слово - "какую-то"
35 DRAGO
 
11.03.09
14:54
только я не пойму для чего они сейчас
36 Новиков
 
11.03.09
14:56
(31 )Кто ж спорит. Еще учитывать надо термин - "цикличность", или глубину сбора состава. Ведь он может на определенной ветке зациклиться. Кароче - теория гласит так - что нужно ограничение в цикле ставить. Ну это так - к слову.

(32) в упп смотри кусок кода где собирается спецификация изделия, или его состав. Там все тупо, медленно. Но если не сталкивался особо с этим - тогда лучше с этого начать.
37 DRAGO
 
11.03.09
14:57
разузловка?
38 Новиков
 
11.03.09
14:58
у меня сейчас работающей конфы нет под рукой. Там где состав изделия собирается в виде дерева - ну погляди сам там.
39 AiR
 
11.03.09
14:59
Ну а кто мешает в 1С описать процедуру с запросом и эту процедуру вызывать рекурсивно?
40 Новиков
 
11.03.09
15:00
человек запрос хотел написать. Чувствуешь разницу? :)
41 DRAGO
 
11.03.09
15:01
Это крайний случай, к которому склоняет 1С.
42 Sadovnikov
 
11.03.09
15:01
(41) А у тебя здесь других вариантов и не остается...
43 Новиков
 
11.03.09
15:05
Вообщем - есть над чем подумать :)

Но то что в языке запросов 8.1. рекурсии нет - это очень хорошо :)
44 DRAGO
 
11.03.09
15:06
Что же хорошего? Наоборот оставили для себя поле развития.
45 mista2009
 
11.03.09
15:11
А что с помощью SQL запросов можно вытянуть такую инфу?
Имеется примитивная тиблица, как с помощью одного запроса вытянуть иерархию?

produkt  zatrata  kolichestvo
А        B        43
A        C        34
D        A        23
D        E        69

Шоб короче были запросы prod, zatr, kol

А что в результате мы должны получить?

D
|___E
|___A
    |__B
    |__C

Иерархию в классическом SQL мы никогда не получим, а то что в 1С иерархия какая-то есть, так это тут не подходит. Все исходные данные для построения результируещего дерева имеются в табличке выше.

Объясните мне дураку что вы тут вообще обсуждаете!!!
46 Sadovnikov
 
11.03.09
15:14
(45) "Иерархию в классическом SQL мы никогда не получим" - любуйся:
Set NoCount On

Declare @ТекстЗапроса NvarChar(4000), @Столбцы1 NvarChar(4000), @ИдРодителя Char(9), @Уровень Int, @i Int
Declare @ДатаМинусМесяц Char(8), @НачТекМесяца Char(8), @КонДатаПлюс1 Char(8), @ИмяРодителя varChar(100)
Declare @Столбцы2 NvarChar(50), @Столбцы3 NvarChar(50), @Столбцы4 NvarChar(50),@Стр VarChar(2)

Set @ДатаМинусМесяц = '20060101'
Set @НачТекМесяца   = '20060201'
Set @КонДатаПлюс1   = '20060211'
Set @ИдРодителя  = '   DJF   '
Set @ИмяРодителя = '01Трубопроводная арматура'
Set @Уровень = 1

Select 0 Уровень, @ИдРодителя ТекИД, Cast(@ИмяРодителя As VarChar(100)) Наименование, Cast(@ИдРодителя As VarChar(200)) СуммаИД
, Cast(@ИдРодителя As VarChar(2000)) ПолныйПуть, @ИдРодителя Ид0
Into #ВремТаб

Create Index Индекс2 On #ВремТаб (ТекИД)

While 1=1 Begin
   Set @ТекстЗапроса = '    
   Alter Table #ВремТаб Add Ид'+Cast(@Уровень As VarChar(2))+' char(9) '
   exec sp_executesql @ТекстЗапроса
   Set @Столбцы1 = ''
   Set @i = 0
   While @i < @Уровень Begin
       Set @Столбцы1 = @Столбцы1 + ',Ид'+Cast(@i As VarChar(2))+ ' Ид'+Cast(@i As VarChar(2))    
       Set @i = @i + 1
   End
   Set @Столбцы1 = @Столбцы1 + ',ID Ид'+Cast(@Уровень As VarChar(2))    
   
   Set @ТекстЗапроса = '    
   Insert Into #ВремТаб
   Select @Уровень Уровень, ID ТекИД, Descr Наименование, СуммаИД+ID СуммаИД, ПолныйПуть+''1''+RTrim(Descr)+ID ПолныйПуть'+@Столбцы1+'
   From SC38 (NoLock)
   Inner Join #ВремТаб (NoLock) On Ид'+Cast(@Уровень-1 As VarChar(2))+' = ParentID
   Where Уровень = @Уровень - 1 And IsFolder = 1'
   
   exec sp_executesql @ТекстЗапроса, N'@Уровень Int', @Уровень

   If @@RowCount = 0 Begin
       Break
   End
   Set @Уровень = @Уровень + 1
End

Select Товар, Склад, Sum(Количество) ОстатокТовара
Into #Остатки
From
( --ОстаткиОстатки
   Select SP222 Товар, SP221 Склад, SP223 Количество From RG220 (NoLock)
   Where Period = @ДатаМинусМесяц
   Union All
   Select SP222 Товар, SP221 Склад
   , (Case DebKred When 0 Then SP223 Else -SP223 End) Количество
   From RA220 (NoLock)
   Where Date_Time_IDDOC >= @НачТекМесяца And Date_Time_IDDOC < @КонДатаПлюс1
) ОстаткиОстатки
Group By  Товар, Склад
Having Sum(Количество) <> 0

Create Index Индекс2 On #Остатки (Товар)

Select *
Into #ОстаткиСПутями
From
(
   Select (Уровень + 1) Уровень, ID ТекИД, (ПолныйПуть+'2'+RTrim(Descr)+ID) ПолныйПутьОстатков, Descr Наименование, СуммаИД --(Ид0+Ид1+Ид2) СуммаИД
   From #ВремТаб (NoLock)
   Inner Join SC38 (NoLock) On ТекИд = ParentId And IsFolder = 2
) СПутями Inner Join #Остатки (NoLock) On ТекИД = Товар

Select Уровень, ТекИД, Наименование, ЭтоГруппа, Склад, ОстатокТовара, КоличествоВРезерве, Цена
From
(
   Select Distinct
   ВТ.Уровень Уровень, ВТ.ТекИД ТекИД, ВТ.Наименование Наименование, ВТ.ПолныйПуть ПолныйПуть, 1 ЭтоГруппа
   , '' Склад, 0 ОстатокТовара, 0 КоличествоВРезерве, 0 Цена
   From #ВремТаб ВТ (NoLock)
   Inner Join #ОстаткиСПутями ОСП On ВТ.ТекИД = Substring(ОСП.СуммаИД, ВТ.Уровень*9+1,9)
       
   Union All
   
   Select Уровень, ТекИД, Наименование, ПолныйПутьОстатков ПолныйПуть, 2 ЭтоГруппа, Склад, ОстатокТовара
   , IsNull(КоличествоВРезерве,0) КоличествоВРезерве, IsNull(Цена,0) Цена
   From  #ОстаткиСПутями (NoLock)
   Left Join
   (
       Select Товар ТоварВРезерве, Sum(Количество) КоличествоВРезерве
       From
       ( --ОстаткиРезервы
           Select SP1280 Товар, SP1281 Количество From RG1282 (NoLock)
           Where Period = @ДатаМинусМесяц
           Union All
           Select SP1280 Товар
           , (Case DebKred When 0 Then SP1281 Else -SP1281 End) Количество
           From RA1282 (NoLock)
           Where Date_Time_IDDOC >= @НачТекМесяца And Date_Time_IDDOC < @КонДатаПлюс1
       ) ОстаткиРезервы
       Group By  Товар
   ) Резервы On ТекИд = ТоварВРезерве
   Left Join
   (
       Select OBJID ИдТовараП, Cast(Value As Numeric(10,2)) Цена
       From _1SCONST (NoLock)
       Inner Join
       (
           Select OBJID ИдОбъекта, Max(Date) Дата
           From _1SCONST (NoLock)
           Where ID = 79 And Date < @КонДатаПлюс1
           Group By OBJID
       ) Даты On OBJID = ИдОбъекта And Date = Дата And ID = 79
   ) Цены On ТекИд = ИдТовараП
) Выборка
Order By ПолныйПуть, Склад

Drop Table #ВремТаб
Drop Table #Остатки
Drop Table #ОстаткиСПутями
47 mista2009
 
11.03.09
15:16
(46) Зри в корень!!! А что у тебя в результате этой всей колбасни то получилось?
48 Sadovnikov
 
11.03.09
15:17
(47) Иерархия " в классическом SQL"
49 mista2009
 
11.03.09
15:21
(48) Как бы тебе объяснить то...
Начнём с того что мы говорим про чистые запросы без временных таблиц, курсоров, циклов, переменных и прочей лабуды.

Ты сможешь с помощью запросов получить иерархию?
50 mista2009
 
11.03.09
15:22
Вот КОНКРЕТНЫЙ очень маленький примерчие. Хачу шоб была иерархия. Выдай мне запрос.

produkt  zatrata  kolichestvo
А        B        43
A        C        34
D        A        23
D        E        69
51 Новиков
 
11.03.09
15:22
(46) Лишний раз посмотреть и убедиться - хорошо что в языке запросов 8.1. нет рекурсии :))))
52 Sadovnikov
 
11.03.09
15:23
(49) А с какого перепуга я буду на себя такие ограничения накладывать? Типа "А стобо сделать то-то и то-то только с использованием методов, описанных с 30 по 122 страницу мануала?". Что за бред-то?
53 mista2009
 
11.03.09
15:23
(51) Ещё один... Посмотри (45) очень внимательно. Если бы была рекурсия по мановению волшебной палочки что бы ты получил в результате её?
54 rs_trade
 
11.03.09
15:23
(50) Почитай книгу "Профессиональное руководство по Transact-SQL. Для профессионалов.2005"  Автор Кен Хендерсон. Там есть несколько примеров иерархии
55 mista2009
 
11.03.09
15:25
(54) Ещё один... ЧТО БУДЕТ В КОНЕЧНОМ РЕЗУЛЬТАТЕ????

produkt  zatrata  kolichestvo
А        B        43
A        C        34
D        A        23
D        E        69

Вам не кажется что будет точно такая же табличка????
56 Sadovnikov
 
11.03.09
15:26
(54) Бесполезно давать такие советы человеку, создающему подобные ветки:
v8: Как обманчивы Null-ы
57 Sadovnikov
 
11.03.09
15:26
(55) "Вам не кажется что будет точно такая же табличка????" - НЕ будет. Тебе ни разу не приходилось средствами скуля таблицы вправо разворачивать?
58 mista2009
 
11.03.09
15:30
(57) Ещё раз... Вот конкретный пример

produkt  zatrata  kolichestvo
А        B        43
A        C        34
D        A        23
D        E        69

Я вижу что некто садовников очень хорошо разбирается в SQL. Выдайте мне запрос на SQL для этих данных. Зачем мне колбасня в (46). Такую колбасню уже тупые адынэсники в УПП используют для построения дерева спецификации. SQL намного круче 1С, соотв. можно сделать всё что угодно. Вперёд Садовников!!!
59 Sadovnikov
 
11.03.09
15:30
(58) Поверь, я уже давным-давно на слабо не ведусь.
60 mista2009
 
11.03.09
15:33
Ау!!!! Мне ктонить создасть этот маленький запросик на SQL???

produkt  zatrata  kolichestvo
А        B        43
A        C        34
D        A        23
D        E        69
61 Sadovnikov
 
11.03.09
15:34
(60) Сколько платишь?
62 Новиков
 
11.03.09
15:36
(60) деревом в виде xml файла с нужными группировками и итогами. Но не за спасибо :) На одном T-SQL :)
63 mista2009
 
11.03.09
15:39
Садовников и Новиков давайте без обид и т.д. Я не сомневаюсь в вашем профессионализме. Я для себя хочу понять.

С помощью только одних запросов SQL вытягиваются только двумерные таблицы?
Типа:

produkt  zatrata  kolichestvo
А        B        43
A        C        34
D        A        23
D        E        69
64 Sadovnikov
 
11.03.09
15:40
(63) "только двумерные таблицы?" - разумеется. Вот, только они могут быть очень разными. Например, растянутыми вправо :)
65 mista2009
 
11.03.09
15:41
(64) Ну хорошо. Ну нарисуй мне результирующую табличку для моих данных

produkt  zatrata  kolichestvo
А        B        43
A        C        34
D        A        23
D        E        69
66 mista2009
 
11.03.09
15:52
Или это тоже платно :)
67 Sadovnikov
 
11.03.09
15:52
(65) Слушай, без обид - а оно мне надо?
68 Новиков
 
11.03.09
15:52
в графе количество должны стоять - посчитанные количества правильно. Затем это можно вылить в xml - и получишь 1С-ное ДЗ, которое останется только влить к себе.
69 mista2009
 
11.03.09
15:54
(68) Чего, чего? Все количества у меня подсчитаны правильно.
Мы щас не говорим об XML и 1С. Мы говорим о классическом SQL.
70 AiR
 
11.03.09
15:56
71 mista2009
 
11.03.09
15:58
(70) Ну вот наконецто появился специалист AiR который мне щас забацает согласно статье http://www.sqlbooks.ru/readarticle.aspx?part=02&file=sql200509 запрос по моим данным и покажет результат запроса.
72 wHammer
 
11.03.09
16:00
mista2009 похоже ты всех уделал
73 Новиков
 
11.03.09
16:09
мда. Если все количества правильно подсчитаны - о чем тогда тут речь ведется? Ты посмотри выше - чего человеку надобно было изначально. Раскрутить вниз дерево до листа и посчитать верх количества по корням. Чтобы это сделать - надо для начала такое дерево собрать. Садовников тебе говорил про разворот в право - это когда плоская твоя табличка будет дополнятся необходимыми полями вправо. В собранно виде - его останется только вывести (куда-то). Если ты считаешь что у тебя все количества в твоем примере посчитаны правильно - значит имеет место быть говорить о каком-то ином понимании того, чего нужно :)
74 mista2009
 
11.03.09
16:13
Уважаемый Новиков я не соблаговолите ли вы мне нарисовать эту результирующую табличку для моих данных. Я бы был вам очень благодарен.

produkt  zatrata  kolichestvo
А        B        43
A        C        34
D        A        23
D        E        69
75 AiR
 
11.03.09
16:16
(71) Я показал пример реализации, в чем у тебя проблема? Есть же Копи-паст в конце концов.
76 mista2009
 
11.03.09
16:17
Ну вот Садовникову и Новикову наверно лень нарисовать результирующую табличку для моих данных. Нарисуй мне пожалуйста.

produkt  zatrata  kolichestvo
А        B        43
A        C        34
D        A        23
D        E        69
77 vvf1973
 
11.03.09
16:20
(77) Вам никто ничего не должен.
78 mista2009
 
11.03.09
16:24
Я чё пытаюсь понять то. Вот тупая 1С и тупые разработчкие УПП не могут нормально и быстро развернуть иерархию. А в SQL это всё делается влёт одним запросом и очень шустро. Ну вот ну покажите мне как это делается без вот этой вот колбасни (46) наподобии построения спецификации в УПП.
79 rs_trade
 
11.03.09
16:26
(78) Ну так иди в разработчики 1С,  и покажи им всем тупым как надо...
80 Новиков
 
11.03.09
16:28
(78) ты разницу понимаешь между языком запросов 8.1. и языком "колбасни". В колбасне резалт получится для вывода.

(79) Причем тут тупость? дело в универсальности (якобы). Я думаю, если бы упп была исключительно в скуль-версии, скорее всего заточка была бы сделана на рекурсионный сбор состава. А т.к. язык-запросов не позволяет сего, посему или так - или сами собирайте.
81 mista2009
 
11.03.09
16:31
"заточка была бы сделана на рекурсионный сбор состава"
Ну вас умоляю, ну покажите мне запрос, ну покажите мне хотябы результат запрос для моих данных, ну пожалуйста  :))))))

produkt  zatrata  kolichestvo
А        B        43
A        C        34
D        A        23
D        E        69
82 rs_trade
 
11.03.09
16:38
(81) Судя по посту (49) для тебя чистый SQL это select * from Table1. А прочая лабуда - временные таблицы, курсоры, циклы, переменные это все приблуды сторонние...
83 mista2009
 
11.03.09
16:38
(79) Я только для начала прочитаю книжечку из (54) послушаю Садовникова с Новиковым и пойду  :)
84 Новиков
 
11.03.09
16:45
ты калькулятором пользоваться умеешь? Дерево уже нарисовал. Осталось количество по дереву подсчитать и нарисовать :) Итоговая табличка будет плоской - но дополненой справа или слева - кто как определит - дополнительными полями. Это первый вариант. Второй - собрать запросом дерево в xml и распарсить его в 1С (с 2005). Тоже пишется "классическим" T-SQL. Во втором варианте будет реальное дерево, которое ты будешь смотреть соотв. вьювером и видеть никакие таблички плоские - а дерево, с листикам корешками :)

Предвкушаю след.вопрос - что будет в доп.полях? Или опять про табличку? :))
85 wHammer
 
11.03.09
16:48
Да, смешно получилось, люди неправы оказались, а сознаться им в этом что-то очень сильно мешает :)
86 Новиков
 
11.03.09
16:49
(85) ну ткни пальчиком где не правы то? :)
87 bahmet
 
11.03.09
16:52
(81)
AD      BCAE      169

только успокойся :))
88 mista2009
 
11.03.09
16:56
(84) А что вы боитесь рисовать таблички и деревья. Они же маленькие. Быстро рисуются. Посмотрите сколько я нарисовал. Так же понятнее. А то вот ты чё-то ляпнул, а конкретики никакой.
89 Новиков
 
11.03.09
16:57
(88) ты топиться пойдешь - нам за тобой бежать бегом? :)
90 wHammer
 
11.03.09
17:03
(86) Нет рекурсии ни в запросах 1С 8.х ни в классическом SQL, а вы пытаетесь доказать обратное, причем как-то уж совсем нелепо, вроде "А оно мне надо - я сказал я прав, значит прав, и доказывать свою правоту не буду, т.к. давно уже на слабо не ведусь" :) Вот в этом и не правы.
91 fisher
 
11.03.09
17:04
Камень преткновения этой ветки - различия в трактовке термина "язык запросов".
В результате каждый прав по своему и флейм обеспечен :)
92 fisher
 
11.03.09
17:08
(90) Ты не совсем прав. Язык запросов к СЕРВЕРУ баз данных отнюдь не ограничивается оператором SELECT. Тебе хватит беглого просмотра (46) даже без знания предмета, чтобы понять о чем речь.
93 rs_trade
 
11.03.09
17:08
(90) С рекурсии давно уже перешли на иерархию...В посте (45) утверждается что средствами SQL нельзя получать иерархию...Все системы построенные на SQL как то обходятся без нее, либо используют извраты, то как временные таблицы, курсоры, циклы, переменные
94 Новиков
 
11.03.09
17:09
(90) Про язык запросов 8.1. - я ничего против не имею и не высказывался  за то что рекурсия там есть. В T-SQL рекурсия организована может быть посредством языка собсна. Как доказать? Порятнки выкладывать сбора состава рекурсивного? Посмотрите тут уже выкладывались они. Или схему преобразования дерева в xml показать? Тоже зрелище не для слабонервных. Я не понимаю - в чем собственно не правы то?
95 wHammer
 
11.03.09
17:09
(92) Ну так речь о классическом SQL, а не о возможностях той или иной СУБД.
96 mista2009
 
11.03.09
17:11
И T-SQL далеко не классический SQL
97 fisher
 
11.03.09
17:12
(95) Это ты так решил. Другие решили по-другому :) Я же сказал, что в этой теме забыли определиться с терминами.
98 mista2009
 
11.03.09
17:15
(93)  А (45) перечитай всётаки, там "Иерархию в классическом SQL мы никогда не получим..."
99 Новиков
 
11.03.09
17:19
жесть. родите меня обратно.

Утверждаю что в T-SQL используемый в MS SQL 2005 и выше можно реализовать рекурсию. Можно кубы олапные городить. Можно запросы даже к екселю писать. Все на скуле. А человек в (0) спрашивал - как средствами языка 8.1. сделать то что он хочет. ответ - средствами только языка запросов - никак. Если писать T-SQL - то можно только запросом получить нужный результат. усе.
100 kiruha
 
11.03.09
17:21
(56)"Бесполезно давать такие советы человеку, создающему подобные ветки:"
v8: Как обманчивы Null-ы

Зря в той ветке закритиковали человека.
Проблема действительно есть, она связана с тем, что в
SQL применяется 3-значная логика, в математике , как правило 2-х значная.
Соответственно некоторые интуитивно-понятные запросы могут иметь неожиданный результат.

Выход на сравнение Null<> Null - может появиться как результат соединения 2 таблиц, а не только как вычурное выражение.

Проблему эту поднимал например Дейт, см.
NULL, трехзначная логика и неопределенность в SQL: критика критики Дейта
http://www.citforum.ru/database/articles/nulls/
101 rs_trade
 
11.03.09
17:45
(98) что ты понимаешь под термином "классический SQL"?  SQL-86 или может быть SEQUEL?
102 Serg_1960
 
11.03.09
17:48
Рецензия:
Прочел всё с удовольствием. Классика жанра. Спор, в котором погибает истина.
Но kiruha круто перевёл стрелки и из безполезной перепалки родилась истина. Неожиданная развязка. Я в восторге.

PS: пойду почитаю ещё что нибудь "от mista2009"
103 mista2009
 
11.03.09
17:48
Ну незнаю я что такое классический. Ну это просто не T-SQL.
104 fisher
 
11.03.09
18:15
Кстати, да. ANSI-SQL начиная с редакции SQL3 1999 года включает рекурсивные (иерархические) запросы (реализованные в Oracle 8, MS SQL 2005, DB2 и вообще всех СУБД соответствующих стандарту SQL 1999), регулярные выражения, процедурные расширения и т.п.
А я и в самом деле не знал про рекурсивные запросы...
<побежал просвящаться>
ЗЫ. А в SQL 2008, оказывается, еще и hierarchyid придумали... Очень надеюсь, что разработчики 1С будут идти в ногу со временем и реализуют все эти вкусности.
105 Humandra
 
12.03.09
05:28
Есть в SQL иерархические запросы, что бы вы не говорили.
В том же Oracle запрос на чистом SQL, возвращающий иерархию будет выглядеть как:

select id
   , idParent
   , Parametrs
 from Table
 connect by prior id = idPrnt
   start with idPrnt is null

Из таблицы

id idPrnt Parametrs
2  1      33
1  null   45
4  3      89
3  1      67

получим таблицу:

id idPrnt Parametrs
1  null   45
2  1      33
3  1      67  
4  3      89

И задачи типа задач о списании затрат решаются одним запросом, правда, не таким простым, чуть посложнее...
106 mista2009
 
12.03.09
07:17
(105) Да замечательно что есть такие запросы. А вам не кажется что в результате просто получилась отсортированная таблица. Или это какая-то хитрая таблица?
107 Corban
 
01.04.09
11:06
Иерархию на обычном SQL еще можно построить с помощью рекурсивного запроса
И делается это с "пол пинка" :)
Вот тебе пример:

ALL
|--SEA
|  |--SUBMARINE
|  |--BOAT
|--EARTH
|  |--CAR
|  |--TWO WHEELES
|  |  |--MOTORCYCLE
|  |  |--BYCYCLE
|  |--TRUCK
|--AIR
  |--ROCKET
  |--PLANE
-----------------------------------------------
IF EXISTS (SELECT *
        FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = USER
        AND TABLE_NAME = 'T_VEHICULE')
    DROP TABLE T_VEHICULE
-- Создать таблицу
CREATE TABLE T_VEHICULE
(VHC_ID INTEGER NOT NULL PRIMARY KEY,
VHC_ID_FATHER INTEGER FOREIGN KEY REFERENCES T_VEHICULE (VHC_ID),
VHC_NAME VARCHAR(16))
-- Наполнить данными
INSERT INTO T_VEHICULE VALUES (1, NULL, 'ALL')
INSERT INTO T_VEHICULE VALUES (2, 1, 'SEA')
INSERT INTO T_VEHICULE VALUES (3, 1, 'EARTH')
INSERT INTO T_VEHICULE VALUES (4, 1, 'AIR')
INSERT INTO T_VEHICULE VALUES (5, 2, 'SUBMARINE')
INSERT INTO T_VEHICULE VALUES (6, 2, 'BOAT')
INSERT INTO T_VEHICULE VALUES (7, 3, 'CAR')
INSERT INTO T_VEHICULE VALUES (8, 3, 'TWO WHEELES')
INSERT INTO T_VEHICULE VALUES (9, 3, 'TRUCK')
INSERT INTO T_VEHICULE VALUES (10, 4, 'ROCKET')
INSERT INTO T_VEHICULE VALUES (11, 4, 'PLANE')
INSERT INTO T_VEHICULE VALUES (12, 8, 'MOTORCYCLE')
INSERT INTO T_VEHICULE VALUES (13, 8, 'BYCYCLE')
------------------------------------------------
--Теперь ищем к примеру откуда пришел товар (к примеру'MOTORCYCLE')
WITH
  tree (data, id)
  AS (SELECT VHC_NAME, VHC_ID_FATHER
     FROM T_VEHICULE
     WHERE VHC_NAME = 'MOTORCYCLE'
     UNION ALL
     SELECT VHC_NAME, VHC_ID_FATHER
     FROM T_VEHICULE V
         INNER JOIN tree t
          ON t.id = V.VHC_ID) SELECT *
FROM tree
-------------------------------------
--Результат:

--data                     id
---------------- -----------
--MOTORCYCLE       8
--TWO WHEELES      3
--EARTH            1
--ALL              NULL
108 mista2009
 
01.04.09
12:07
Вроде умные люди, такие сложные запросы строят...

"Иерархию на обычном SQL еще можно построить с помощью рекурсивного запроса"

Я вижу что иерархию ты постоил в блокнотике!!! А с помощью рекурсии ты только нашёл откуда пришёл товар!!! :)))


А чтобы на самом деле построить иерархию визуально в какойнить формечке тебе никакие круты рекурсивные запросы не помогут. Только обычные селекты.
109 Corban
 
01.04.09
12:27
" А с помощью рекурсии ты только нашёл откуда пришёл товар!!! :))) ""
- так вот это самое главное и основное..а как расположить эти колонки на экране это уже дело второе.. и тут на вкус и цвет..
Думаю не надо показывать, как пользоваться кейсами:)
110 mista2009
 
01.04.09
12:39
(109) Пипец.. Ты чё иерархию с листьев строишь??? Наверно с корня и до листьев всё таки? И на кой тут твои крутые запросы?
111 Corban
 
01.04.09
12:56
По-моему мы говорим на разных языках..

Какая разница с чего начинает обход запрос , я не пойму.. По-моему главное результат, или я не прав..
Если ты считаешь, что результат не верный, то это наверное потому, что кто-то неправильно поставил задачу, или сам не понимает что хочет)

Нарисуй, что ты хочешь видеть в конечно итоге!
112 Corban
 
01.04.09
12:59
"Наверно с корня и до листьев всё таки?" - кстати он как раз так и работает..
В данном случае пока не уперся в Null
113 mista2009
 
01.04.09
13:07
(111)

Ты же вроде сам нарисовал дерево и сказал что я его с пол пинка построю с помощью рекурсивного запроса :))) И непонятно к чему привёл запрос для получения всех родителей у листа. Как будто с помощью этого запроса можно строить деревья. Как запрос получающий всех родителей поможет построить дерево.
Вроде наоборот надо. Находим корень. У корня нет родителя. С помощью тупого селекта выбираем все элементы у которых родителем является корень. И т.д.

Объясните мне тупому конфигурасту зачем как мне поможет рекурсия????????

ALL
|--SEA
|  |--SUBMARINE
|  |--BOAT
|--EARTH
|  |--CAR
|  |--TWO WHEELES
|  |  |--MOTORCYCLE
|  |  |--BYCYCLE
|  |--TRUCK
|--AIR
  |--ROCKET
  |--PLANE
114 Corban
 
01.04.09
13:08
такой вариант тебя устроит?
-----------------------------------------
WITH tree (data, id, level,  pathstr)
AS (SELECT VHC_NAME, VHC_ID, 0,
        CAST('' AS VARCHAR(MAX))
    FROM T_VEHICULE
    WHERE VHC_ID_FATHER IS NULL
    UNION ALL
    SELECT VHC_NAME, VHC_ID, t.level + 1, t.pathstr + V.VHC_NAME
    FROM T_VEHICULE V
        INNER JOIN tree t
            ON t.id = V.VHC_ID_FATHER)
SELECT SPACE(level) + data as data, id, level, pathstr
FROM tree
ORDER BY pathstr, id
------------------------------------------
вставь его вместо
--------------------------------------
WITH
  tree (data, id)
  AS (SELECT VHC_NAME, VHC_ID_FATHER
     FROM T_VEHICULE
     WHERE VHC_NAME = 'MOTORCYCLE'
     UNION ALL
     SELECT VHC_NAME, VHC_ID_FATHER
     FROM T_VEHICULE V
         INNER JOIN tree t
          ON t.id = V.VHC_ID) SELECT *
FROM tree
--------------------------------------
115 Serg_1960
 
01.04.09
13:12
Вы зачем ворошите прошлое? Ветка тихо скончалась сама собой, а Вы опять... труп из могилы... конфигурасты-некрофилы :(
116 Corban
 
01.04.09
13:18
Ну человек остался не удовлетворен:)..надо же поставить точку в этой дискуссии.
117 mista2009
 
01.04.09
13:18
Пля хитрый запрос...
В результате этого запроса что будет?

WITH tree (data, id, level,  pathstr)
AS (SELECT VHC_NAME, VHC_ID, 0,
        CAST('' AS VARCHAR(MAX))
    FROM T_VEHICULE
    WHERE VHC_ID_FATHER IS NULL
    UNION ALL
    SELECT VHC_NAME, VHC_ID, t.level + 1, t.pathstr + V.VHC_NAME
   FROM T_VEHICULE V
       INNER JOIN tree t
            ON t.id = V.VHC_ID_FATHER)
SELECT SPACE(level) + data as data, id, level, pathstr
FROM tree
ORDER BY pathstr, id
118 Corban
 
01.04.09
13:21
а что так сложно воткнуть его в аналайзер..ну да ладно..
Вот что будет
-------------------------------------------------------
data    id    level    pathstr
ALL    1    0    
AIR    4    1    AIR
 PLANE    11    2    AIRPLANE
 ROCKET    10    2    AIRROCKET
EARTH    3    1    EARTH
 CAR    7    2    EARTHCAR
 TRUCK    9    2    EARTHTRUCK
 TWO WHEELES    8    2    EARTHTWO WHEELES
  BYCYCLE    13    3    EARTHTWO WHEELESBYCYCLE
  MOTORCYCLE    12    3    EARTHTWO WHEELESMOTORCYCLE
SEA    2    1    SEA
 BOAT    6    2    SEABOAT
 SUBMARINE    5    2    SEASUBMARINE
119 Corban
 
01.04.09
13:22
только тут все полыло почему-то..но смысл думаю понятен
120 КВАДРО2
 
01.04.09
13:23
(0) Как два пальца обоссать
121 Corban
 
01.04.09
13:24
data               id               level               pathstr
ALL        1        0
AIR        4        4        AIR
 PLANE    11        2        AIRPLANE
 ROCKET    10        2        AIRROCKET
EARTH        3        1        EARTH
 CAR        7        2        EARTHCAR
 TRUCK    9        2        EARTHTRUCK
 TWO WHEELES    8        2        EARTHTWO WHEELES
  BYCYCLE    13        3        EARTHTWO WHEELESBYCYCLE
  MOTORCYCLE    12        3        EARTHTWO WHEELESMOTORCYCLE
SEA        2        1        SEA
 BOAT        6        2        SEABOAT
 SUBMARINE    5        2        SEASUBMARINE
122 Corban
 
01.04.09
13:24
жесть..тупой движок форума..
123 mista2009
 
01.04.09
13:24
(118) Это обычная двумерная таблица?
124 Corban
 
01.04.09
13:25
а ты как считаешь? :)
125 mista2009
 
01.04.09
13:26
Не знаю. Я тебя в (117) и спрашиваю.
126 Corban
 
01.04.09
13:29
отвечаю -ДА
127 mista2009
 
01.04.09
13:36
(126) Ну хорошо... Я имею эту таблику. Хочу вывести в дерево на форме.
Мне эта табличка как то поможет?
128 mista2009
 
01.04.09
13:37
Согласись что это просто двумерная таблица упорядоченная определенным образом?
129 Corban
 
01.04.09
13:51
Послушай, я не знаю твоей задачи, и я не программист 1С
Ты попросил
--------------------------------------------
А что в результате мы должны получить?

D
|___E
|___A
    |__B
    |__C
----------------------------------------
- а теперь спрашиваешь, как это тебе поможет для построения формы.
а дальше ты захочешь чтобы каждое поле в этой форме было активно и ты мог кликом на любое перейти в хз куда..
Если бы ты с самого начала описал подробно твою задачу, то думаю такой длинной дискусси не было.
--P.S Умейте правильно задавать вопросы.
130 mista2009
 
01.04.09
15:50
(129) Да нету у меня никакой задачи. Чё толку от твоего запроса крутого если ещё придётся код колбасить для вывода. Я к тому что от рекурсии толку тут никакого.