Имя: Пароль:
1C
1С v8
как сделать такой запрос?
, ,
0 Помогите
 
01.08.13
07:37
Нужно выбрать первые несколько элементов справочника по определенному условию и реквизиту сортировки, а так же родителей этих элементов, причем количество родителей должно быть ровно 2 (этим нужно как-то ограничить количество выводимых элементов)

Получиться должно так:

ГРУППА ПРОДУКТЫ
  молоко
  сметана
ГРУППА ЕДА
  творог
  мясо
  яйцо

получается в данном случае что выбралось 5 элементов.
Как это сделать?
1 mzelensky
 
01.08.13
07:40
Пишешь первые 10 (если нужно первые 10 элементов) и Из них выбираешь Элемент.Родитель
2 Помогите
 
01.08.13
07:41
(1) А как определить что мне нужно только первые 10? Ведь не известно сколько будет точно, известно только что нужно две группы
3 Помогите
 
01.08.13
07:43
Если я выберу первые 10, и окажется что они все находятся в одной группе, то выведется только одна группа. А надо две.
4 Лодырь
 
01.08.13
07:45
А если ты выберешь 10 и окажется что они все находятся в разных группах, что ты будешь выводить?
5 Капитан О
 
01.08.13
07:46
откуда вы такие вопросы берёте?
имеющие количество различные родитель =2 или что-то в этом духе
6 Irbis
 
01.08.13
07:50
ну выбери сначала два первых родителя.
7 mzelensky
 
01.08.13
08:01
(1) Опиши задачу с самого начала. Что ты вообще хочешь этим получить и для чего?!
8 Oleg_Kag
 
01.08.13
08:14
Сей час меня "порвут" и оптимизируют, но:
ВЫБРАТЬ ПЕРВЫЕ 10
    Номенклатура.Родитель,
    Номенклатура.Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель В
            (ВЫБРАТЬ ПЕРВЫЕ 2
                Номенклатура.Родитель
            ИЗ
                Справочник.Номенклатура КАК Номенклатура
            ГДЕ
                Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка))
9 Помогите
 
01.08.13
08:18
(4), (8) Почему нужно выбирать первые 10, а не 10000?
(6) Было бы отлично! По какому условию их можно выбрать?
10 Помогите
 
01.08.13
08:20
(7) Сначала там ничего интересного не было: Встал я утром, умылся, еще кое-что сделал, сел в четвертый трамвай и приехал в универ. Захожу к преподу на пересдачу, а он мне такую задачу дает: (0), говорит если решишь, то поставлю зачет.
11 Starhan
 
01.08.13
08:23
(8) группировку еще добавить по родителю
12 Помогите
 
01.08.13
08:26
Я предполагаю нужно сделать следующее:
Выбрать один первый элемент. Получить его группу. Выбрать еще один первый элемент с условием что он не в этой группе. Получить его группу.
Выбрать все элементы с условием что они в этих двух группах.

Все, короче, сам разобрался. Жаль никто не догадался. Всем спасибо за помощь
13 Помогите
 
01.08.13
08:30
(8) тут не правильно, потому что тут первые выбранные элементы не обязательно будут находиться в первых выбранных группах. Они будут пропущены, и выберутся другие элементы из первых двух групп.
14 mzelensky
 
01.08.13
08:38
(12) не дай бог тебюе такое написать в какой-нить реальной конфе...а для препода давай, вояй.
15 Помогите
 
01.08.13
08:39
(14) Знаешь способ лучше? )))
16 Лодырь
 
01.08.13
08:42
(15) Предположим тебе надо выбрать первые 10 элементов и первых 2 родителей. Структура следующая:
Родитель1
Элемент11
Родитель2
Элемент21
Родитель3
Элемент31
..
Элемент310

Впорос - что выдаст твой алгоритм? Ответ:
Родитель1
Элемент11
Родитель2
Элемент21

Итог: неверно, тк на самом деле элементов больше, пусть и сдругими родителями.
17 mzelensky
 
01.08.13
09:09
(15) сама по себе задача бредовая, либо ты ее не так понял, как надо. Советую вернуться к преподу и уточнить все более подробно (под запись), а потом уже кидаться в программирование.
18 Oleg_Kag
 
01.08.13
09:23
(12) бубубу
заменит в запросе строчку
(ВЫБРАТЬ ПЕРВЫЕ 2
на
(ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 2
19 skunk
 
01.08.13
09:27
ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Родитель
ПОМЕСТИТЬ тзЭлементы
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.ЭтоГруппа = ЛОЖЬ
    И Номенклатура.ПометкаУдаления = ЛОЖЬ
    // и тут добавляем нужные тебе условия
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 2
    тзЭлементы.Родитель
ПОМЕСТИТЬ тзГруппа
ИЗ
    тзЭлементы КАК тзЭлементы
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    тзЭлементы.Ссылка,
    тзЭлементы.Родитель
ИЗ
    тзГруппа КАК тзГруппа
        ЛЕВОЕ СОЕДИНЕНИЕ тзЭлементы КАК тзЭлементы
        ПО тзГруппа.Родитель = тзЭлементы.Родитель
20 Помогите
 
01.08.13
09:36
(16) Я это и объясняю. Мне не нужно первые 10 элементов.
21 Помогите
 
01.08.13
09:37
(17) Я все правильно понял. Задача такая и есть, бредовая.
22 Помогите
 
01.08.13
09:39
(19) Так будет выбрано на много больше элементов чем нужно, в первом же запросе. За такое у нас сразу на пересдачу отправляли, и не дай бог это в рабочей базе написать.
23 mzelensky
 
01.08.13
09:58
(22) первую таблицу можно ограничить.

Типа так

ВЫБРАТЬ первые 2
    Номенклатура.Ссылка,
    Номенклатура.Родитель
ПОМЕСТИТЬ тзЭлементы
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.ЭтоГруппа = ИСТИНА
    И Номенклатура.ПометкаУдаления = ЛОЖЬ
    И Номенклатура.Родитель = Значение(справочник.номенклатура.пустаяссылка)
;




Так ты выбирешь на верхнем уровне первые 2 группы.
24 mzelensky
 
01.08.13
09:59
(24) а далее выбираешь номенклатуру ,которая находится в иерархии этих групп и накладываешь доп условия (на количество элементов или еще чего)
25 Помогите
 
01.08.13
10:08
(23) Не обязательно что это именно те группы которые нам нужны.
26 Помогите
 
01.08.13
10:22
Лучше чем (12) все равно ничего не придумаешь
27 mzelensky
 
01.08.13
10:23
(25) Блин, чувак...так ты говори- КАКИЕ ТЕБЕ НУЖНЫ! У тебя один пост противоречит другому.  Определись уже что тебе нужно получить и при каких входных данных.
28 Лодырь
 
01.08.13
10:24
(26) В (19) лучше.
29 Помогите
 
01.08.13
10:50
(27) У меня ни один пост не противоречит другому. Все основное написано в (0)

(28) в (19) выбираются все элементы, это очень не рационально, а значит оно не может быть лучше.
30 skunk
 
01.08.13
11:00
(29)ты сильно удивишися но любой запрос выбирает все элементы
31 skunk
 
01.08.13
11:02
а в (12)ты будешь это делать аж два раза ... как минимум
32 Помогите
 
01.08.13
12:11
(30) открою тебе секрет, можно делать запросы которые выбирают ограниченное количество элементов, вплоть до 0. Советую подправить свои запросы которые выбирают все элементы чтобы уменьшить нагрузку на сервер.
33 Капитан О
 
01.08.13
12:16
/*достаю поп-корн*/
34 Помогите
 
01.08.13
12:22
popcorn больше нет
35 skunk
 
01.08.13
12:25
(32)я не буде тебя переубеждать ... запусти свой запрос и глянь в профилировщике нагрузку ... и запусти мой ... сравни ...

если ты по "выбирать" понимаешь добавление отобраной записи в таблицу темдиби ... то я под выбокрой подразумеваю именно источник данных из которых берется записи удовлетворящие твоим запросам
36 Лодырь
 
01.08.13
12:27
(32) Искренне интересно как SQL сервер будет получать N записей удолетворяющих некоторому критерию и отсортированных определенным образом из некой таблицы данных, при этом не получая ее всю.
37 skunk
 
01.08.13
12:27
собственно сколько отберет скул записей 0 или 1000 не так уж и важно ... время выполения запроса будет почти одинаково ...
38 Лодырь
 
01.08.13
12:28
(36) окончание поста читать как:
N записей удолетворяющих некоторому критериюиз некой таблицы данных отсортированной определенным образом , при этом не получая ее всю.
39 Помогите
 
01.08.13
12:40
(36) LIMIT N. не?

(37) Зато важно где ты делал ПОМЕСТИТЬ тзЭлементы, и потом где второй раз перебирал их.
40 skunk
 
01.08.13
12:45
(39)угу ... вот только тзЭлементы это табличка в темдиби ... которая в несколько раз меньше источника данных ...

то есть в моем случае ...  справочник номенклатуры из 30.000 элементов ... отобрал первым запросом 1000 ... второй запрос обрабатывает только 1000 записей ... а у тебя продолжает шуршать по 30.000


угадай что быстрее переберется
41 skunk
 
01.08.13
12:46
можешь даже не будем учитывать фрагментацию данных в базе ... в отличии от отсуствия таковой в темдиби
42 Помогите
 
01.08.13
13:05
(40) Почему так уверен что в несколько? Может всего в 1.5 раза. В прайсе 150 000 товаров, отобрал первым запросом 100 000, и потом снова их перелопатил второй раз зачем-то. А у меня наткнулся на первую подходящую перебрав всего ~1000 записей, потом вторую так же ~1000, потом выбрал из 150 000 один раз.
Итого у тебя 150 000 + 100 000, у меня 1000 + 1000 + 150 000
43 Помогите
 
01.08.13
13:11
+(42) поправка, у меня во второй раз переберет ~1000 + ~1000
44 skunk
 
01.08.13
13:17
наивный
45 Помогите
 
01.08.13
13:24
(44) :)
46 Лодырь
 
01.08.13
13:30
(39) И откуда возьмется LIMIT?
47 Помогите
 
01.08.13
13:36
первые 1. Не?
48 Лодырь
 
01.08.13
13:40
(47) Не.
Еще раз. Есть у тебя ТаблицаДанных на сервере. Теперь тебе нужно выбрать первые(N) удолетворяющие некому критерию из нее но упорядоченной другим способом. Как ты отсортируешь таблицу не получая ее всю? Даже если ты сначала отберешь записи по критерию а потом будешь сортировать, то все равно тебе придется получить всю таблицу чтобы вычислить критерий.
49 Помогите
 
01.08.13
13:45
(48) А если они проиндексированы по полю по которому мне нужно их отсортировать? И условие стоит тоже по индексированному полю?
50 Лодырь
 
01.08.13
13:46
(49) Ты придумываешь частные случаи. В общем не прокатит.
51 Помогите
 
01.08.13
13:50
(50) Предлагаю наиболее вероятный вариант. Просто в моих базах обычно поля по которым идет отбор индексируются.
52 Лодырь
 
01.08.13
13:52
(51) Рад за тебя, обладающего мощными телепатическими способностями и способным предугадывать все извращенные желания пользователей.
53 Помогите
 
01.08.13
13:55
(52) все гораздо проще. Пользователи могут сделать только то, что запрограммировано. А то чего не запрограммировано, им не доступно.
54 skunk
 
01.08.13
13:56
вот тебе вариант ... имеме два регистра сведений ... переодические ... отбирать будем по периоду ...

запрос такой
ВЫБРАТЬ ПЕРВЫЕ 1
    регистр.Период
ИЗ
    РегистрСведений.НашРегистр КАК регистр
ГДЕ
    регистр.Период > ДАТАВРЕМЯ(1956, 1, 1)

(1)в одном регистре(_InfoRg4551) имеет 421 запись
(2)в другом регистре(_InfoRg4565) имеет 7069 записей

запрос к регистру (1) 1с выполняется 0,005964 секунды
запрос к регистру (2) 1с за 0,006561 секунды


угадай из-за чего такая большая разница ... ведь в обоих случаях выбирается первая запись ... то есть время выполнения должно быть одинаковым
55 skunk
 
01.08.13
14:35
раз не угадал то я тебе говорю

твой запрос прошелестит 150.000 раз в поисках первой группы ... второй раз 150.000 раз в поисках второй ... и третий раз 150.000 что-бы выбрать собственно элементы

мой запрос 150.000 в поисках всех элементов удовлетворящих условиям ... получит ЭН записей явно меньше 150.000 ... потом ЭН раз для поиска групп ... и потом ЭН раз в поисках собственно элементов ...

то есть скорость выполнения моего запроса будет явно быстрее чем меньше элементов он отберет в первой случае ...

и это еще не учитывая того, что в темпдиби записи будут лежать попрядку ... и даже в случае ЭН = 150.000 ... мой запрос отработает быстрее
56 Помогите
 
02.08.13
06:54
(54) Где большая разница? Она почти никакая, в пределах погрешности.
57 skunk
 
02.08.13
06:58
нюню
58 skunk
 
02.08.13
06:59
ты там что ... на 286 эхстишках еще работаешь?
59 Помогите
 
02.08.13
07:49
Я нет. У нас мощный сервер, в прошлом году покупали новый.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн