|
Помогите оптимизировать запрос | ☑ | ||
---|---|---|---|---|
0
oslokot
23.08.13
✎
14:10
|
Простой запрос к регистру значений свойств.
Выбираю все значения по указанному свойству, объекты которых не помечены на удаление и соответствуют некоторому наименованию. Запрос = Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | ЗначенияСвойствОбъектов.Объект КАК Объект |ИЗ | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов |ГДЕ | ЗначенияСвойствОбъектов.Свойство = &ВыбСвойство | И ЗначенияСвойствОбъектов.Значение В(&ВыбСписокЗначенийСвойств) | И НЕ ЗначенияСвойствОбъектов.Объект.ПометкаУдаления | И ЗначенияСвойствОбъектов.Объект.Наименование ПОДОБНО &ВыбНаименование |АВТОУПОРЯДОЧИВАНИЕ"; Запрос.УстановитьПараметр("ВыбСвойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Тип ТПА")); Запрос.УстановитьПараметр("ВыбСписокЗначенийСвойств", ВыбСписокЗначенийСвойств); Запрос.УстановитьПараметр("ВыбНаименование", "шпилька%"); С двумя последними условиями, запрос работает на порядок дольше чем без них. Как написать правильно? Прошу простить, недавно начал изучать запросы. |
|||
68
z01
23.08.13
✎
16:09
|
(66)(60)так вот и тут о том что лучше его склонить к левому внешнему
|
|||
69
genosse
23.08.13
✎
16:09
|
"как пирамида подзапросов" - ребята, что тут за бред???
|
|||
70
genosse
23.08.13
✎
16:09
|
антинаучный флуд чтоли пошел
|
|||
71
z01
23.08.13
✎
16:10
|
(67)в первую очередь скорее всего будет исполнен самый нижний и т.д. наверх
|
|||
72
Полотенчик
23.08.13
✎
16:10
|
(31) вместо оптимизации запроса увеличиваешь время записи и потерю места лишними индексами?
|
|||
73
Bober
23.08.13
✎
16:11
|
(69) пирамида маслоу
|
|||
74
z01
23.08.13
✎
16:11
|
(69) "ВЫБРАТЬ
| Валюты.Ссылка |ИЗ | Справочник.Валюты КАК Валюты | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | Валюты.Ссылка КАК Ссылка | ИЗ | Справочник.Валюты КАК Валюты | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | Валюты.Ссылка КАК Ссылка | ИЗ | Справочник.Валюты КАК Валюты) КАК ВложенныйЗапрос | ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка) КАК ВложенныйЗапрос | ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка" |
|||
75
z01
23.08.13
✎
16:12
|
точнее так
ВЫБРАТЬ | Валюты.Ссылка |ИЗ | Справочник.Валюты КАК Валюты | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | Валюты.Ссылка КАК Ссылка | ИЗ | Справочник.Валюты КАК Валюты | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | Валюты.Ссылка КАК Ссылка | ИЗ | Справочник.Валюты КАК Валюты) КАК ВложенныйЗапрос | ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка) КАК ВложенныйЗапрос | ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка |
|||
76
Bober
23.08.13
✎
16:12
|
Zed's dead baby, Zed's dead
|
|||
77
z01
23.08.13
✎
16:13
|
сорри спешу )))
вот правильный вариант ВЫБРАТЬ | Валюты.Ссылка |ИЗ | (ВЫБРАТЬ | Валюты.Ссылка КАК Ссылка | ИЗ | (ВЫБРАТЬ | Валюты.Ссылка КАК Ссылка | ИЗ | Справочник.Валюты КАК Валюты) КАК ВложенныйЗапрос | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Валюты КАК Валюты | ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка) КАК ВложенныйЗапрос | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Валюты КАК Валюты | ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка ))) |
|||
78
Bober
23.08.13
✎
16:13
|
(74)(75)(77) нет времени объяснять, расстрелять
|
|||
79
z01
23.08.13
✎
16:17
|
(78)это пример пирамиды только справочник там один просто для примера, внизу должен был быть отбор по запросу сабжа возращающий минимум строк и т.д. т.е. задача так компонуется чтобы все условия соблюсти но левыми внешними сделать результат на каждом этапе возвращающающий минимум строк, если ларечникам не понятно то это печалька, удачки вам )))
|
|||
80
viktor_vv
23.08.13
✎
16:17
|
(78)+1 . Особенно (74) (75). Че-то мне имхается эти многоуровневые подзапросы свернут башку оптимизатору скуля влегкую.
|
|||
81
z01
23.08.13
✎
16:17
|
(79) и скуль будет летать
|
|||
82
z01
23.08.13
✎
16:18
|
(80)концепт в (77) остальное потереть нужно
|
|||
83
viktor_vv
23.08.13
✎
16:19
|
(79) Я таки настаиваю, что порядок написания подзапросов и их вложенность никак не повлияет на план выполнения, а только усугубит проюлему скулю с построением плана.
|
|||
84
Bober
23.08.13
✎
16:20
|
(83) +1
|
|||
85
genosse
23.08.13
✎
16:23
|
ветка пятничного ламерского бреда )))
|
|||
86
z01
23.08.13
✎
16:25
|
(83)(84)и правильно, представьте что у вас записей во всех задействованных таблицах от сотен тысяч до миллионов хотя бы. и скуль админы не дают а индексы ларечник шеф вместе с конфой держит. и что вы будете делать? делать так чтобы промежуточные результаты содержали бы минимум строк, последний раз повторяю подумайте как скуль работает, он работает с таблицами а не по волшебству и если у вас в промежуточных результатах миллион записей это и подтормозит всё а я выложил метод который почти 100% сработает как директива построителю.
|
|||
87
z01
23.08.13
✎
16:26
|
(85)да. достали уже. вместо того чтобы пояснить человеку как запрос переписать они ему хвастаются как доказали практически торможение составных данных, а толку то что с того, запрос от этих рассуждений быстрее не сработает
|
|||
88
Bober
23.08.13
✎
16:28
|
давно я так не ржал
|
|||
89
z01
23.08.13
✎
16:28
|
просто мой подход более универсален чем метод обхода проблемы указанный в
http://infostart.ru/public/184361/ вот и бесятся |
|||
90
z01
23.08.13
✎
16:29
|
короче последний раз пишу:
чем искать как отобрать по составному типу лучше отобрать части составного типа и к ним приджойнить таблицу из которй нужно отобрать |
|||
91
oslokot
23.08.13
✎
16:30
|
Итак. Запрос (17) и запрос (30), выполняются абсолютно одинаково по времени, судя по замеру производительности. Что подтверждает (23)
Ура) Думаю вот, какой оставить, внутреннее или левое соединение |
|||
92
viktor_vv
23.08.13
✎
16:30
|
||||
93
oslokot
23.08.13
✎
16:31
|
(91) * (30)>(55)
|
|||
94
Bober
23.08.13
✎
16:32
|
"скуль админы не дают а индексы ларечник шеф вместе с конфой держит" и наш герой, который подсказывает построителю отчета как оптимизатор скля должен работать. ипанись. вы там наверное не учетом занимаетесь, а соревнуетесь, кто больше всех удивит.
|
|||
95
viktor_vv
23.08.13
✎
16:32
|
* во втором sub1.id ->> t1.id
и количество записей в t1 в 100 раз больше чем в t2. |
|||
96
Bober
23.08.13
✎
16:32
|
(95) как ты жесток.
|
|||
97
oslokot
23.08.13
✎
16:33
|
(91) + тьфу ты тяпница!) все перепутал.
Кароче (17) и (20) выполняются по времени одинаково. Все ништяк |
|||
98
viktor_vv
23.08.13
✎
16:34
|
(96) А то :).
|
|||
99
Bober
23.08.13
✎
16:34
|
(97) а мы тут уже сменили темы разговора
|
|||
100
viktor_vv
23.08.13
✎
16:36
|
(99) Это типа жених и невеста на свадьбе нужны первые 10 минут, в качестве повода побухать :).
|
|||
101
oslokot
23.08.13
✎
16:36
|
100 )
|
|||
102
oslokot
23.08.13
✎
16:36
|
(99) (100) ха, я заметил )
|
|||
103
z01
23.08.13
✎
16:36
|
(95)да хватит уже разводить ))) я же писал что допустим индексы есть, а если нет и поиск значителен то при построении запроса подзапросы следует строить с учетом размера таблиц )))(94)а вы ларечники наверное и никогда не писали запросы под большие базы где реально видно что если его компоновать не так как я рекомендую то он вообще ничего никогда не выдаст за приемлемое время
|
|||
104
Bober
23.08.13
✎
16:38
|
(103) я на латочника работаю, он файловую базу на флешке носит .
|
|||
105
z01
23.08.13
✎
16:38
|
(100)просто наверное он один раз на выполнение запустил, а со второго пошло и сабжа нет )))
|
|||
106
viktor_vv
23.08.13
✎
16:39
|
(103) Так ответ будет на (92) ?
Учитывая твое "выложил метод который почти 100% сработает как директива построителю" для тебя ответ должен быть как бы очевиден. |
|||
107
Bober
23.08.13
✎
16:39
|
(106) ответа он не знает, админы не дают доступа к скл серверу.
|
|||
108
z01
23.08.13
✎
16:42
|
(104)да не важно на кого ты работаешь, ларечник это диагноз иногда даже на большие базы люди попадают и всё равно предлагают вместо того чтобы индекс добавить купить сервер в 10 раз дороже
(106) ответ в (103) и у тебя там не совсем наш случай, и я утверждаю что моя метода работает как директива, но имхо это помогает и в частности обойти проблему составных типов даже не думая о них |
|||
109
z01
23.08.13
✎
16:45
|
(106)джойнить нужно к результату подзапроса ))) умники. а у тебя везде левое к sub1 ))
|
|||
110
viktor_vv
23.08.13
✎
16:45
|
(108) Ну так номер варианта назови из (92) 1. или 2. ?
Я привел илюстрацию для твоего утверждения насчет директив планировщику запросов. |
|||
111
z01
23.08.13
✎
16:46
|
(110)джойнить нужно к результату подзапроса , а у тебя везде левое к sub1
|
|||
112
Bober
23.08.13
✎
16:48
|
чет скучно здесь стало, зедик уже не веселит.
|
|||
113
z01
23.08.13
✎
16:49
|
(111)(110)или нет?
|
|||
114
viktor_vv
23.08.13
✎
16:49
|
Ну а sub1 это разве не результат подзапроса. Мне нужны там все записи из таблицы t1 удовлетворяющие условию a=@p в соединении с таблицей t2.
|
|||
115
oslokot
23.08.13
✎
16:59
|
Подождите Гуру, не расходитесь.
Еще маленький вопрос. как написать по-правильному вот такую кучу условий: ... | И НЕ Наименование ПОДОБНО &ВыбПодСтрокаИсключить1 | И НЕ Наименование ПОДОБНО &ВыбПодСтрокаИсключить2 | И НЕ Наименование ПОДОБНО &ВыбПодСтрокаИсключить3 | И НЕ Наименование ПОДОБНО &ВыбПодСтрокаИсключить4 ... Запрос.УстановитьПараметр("ВыбПодстрокаИсключить1", "яя%"); Запрос.УстановитьПараметр("ВыбПодстрокаИсключить2", "%шайба-гровер%"); Запрос.УстановитьПараметр("ВыбПодстрокаИсключить3", "%шпилька в комплекте%"); Запрос.УстановитьПараметр("ВыбПодстрокаИсключить4", "% простой%"); |
|||
116
Bober
23.08.13
✎
17:01
|
(115) Может лучше полнотекстовый поиск включить
|
|||
117
z01
23.08.13
✎
17:04
|
(114)Select
sub1.id From t1 as t1 это не ошибка? |
|||
118
Bober
23.08.13
✎
17:05
|
(115) если запрос вида ВЫБРАТЬ Ссылка ИЗ --- ГДЕ то никак, это и есть нормальная версия. если что-то сложнее, то нужно смотреть запрос.
|
|||
119
viktor_vv
23.08.13
✎
17:05
|
(117) Ошибка. В (95) поправил и дополнительную вводную дал.
|
|||
120
viktor_vv
23.08.13
✎
17:07
|
(118) Он наверное это к соединению со свойствами прилепить хочет.
Наверное лучше сначала по справочнику в пакете загнать во временную таблицу по условию и дальше ее уже использовать со свойствами. |
|||
121
z01
23.08.13
✎
17:14
|
(119)ты там к таблице один джойниш таблицу два и отбираешь по условию по полю таблицы 1 во втором случае и отбираешь по условию таблицы 1 и джойнишь к результату таблицу 2 в первом.
первый быстрее так как записей на первом этапе первого (выборка по условию) меньше чем на первом этапе второго (соединение) |
|||
122
viktor_vv
23.08.13
✎
17:17
|
(121) Ну что и требовалось доказать. Таки на самом деле в 99.5% случаев для обоих запросов из (92) скуль построит абсолютно идентичные планы запроса, соотвественно и время выполнения будет одинаково.
Полпроцента оставил на совесть скуля и статистики, а то мало ли :). |
|||
123
z01
23.08.13
✎
17:27
|
(122)в запросе как в сабже всё уже не так может быть как нам хотелось бы, иначе не было бы сабжа
|
|||
124
viktor_vv
23.08.13
✎
17:31
|
Где-то я могу согласится, что подзапросами как-то может быть можно повлият на составление плана запроса, но это очень не очевидно.
Пример в (92) приведен, чтобы ты не увлекался идеей директив построителю через порядок написания подзапросов " сработает как директива построителю". |
|||
125
oslokot
23.08.13
✎
17:47
|
(120) да, прикрутить к своему запросу. Хорошо, пока оставлю так.
|
|||
126
Bober
23.08.13
✎
17:58
|
(125) сделать забор данных в отдельном запросе с времянкой
|
|||
127
Bober
23.08.13
✎
17:58
|
(125) как посоветовали в (120)
|
|||
128
Bober
23.08.13
✎
18:00
|
(125) вообще такие вещи уже хорошо делать через СКД с использованием расширения запроса для СКД
|
|||
129
oslokot
27.08.13
✎
10:51
|
Всем привет! Помогите усложнить запрос.
На данном этапе он выглядит так: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Объект, | Номенклатура.Наименование КАК Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект | И (ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура) |ГДЕ | ЗначенияСвойствОбъектов.Свойство = &ВыбСвойство | И ЗначенияСвойствОбъектов.Значение = &ВыбЗначение | И НЕ Номенклатура.ПометкаУдаления | И НЕ Номенклатура.ЭтоГруппа | |УПОРЯДОЧИТЬ ПО | Номенклатура.Наименование"; Запрос.УстановитьПараметр("ВыбСвойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Тип ТПА")); Запрос.УстановитьПараметр("ВыбЗначение", Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Фланец")); Этот простой запрос выбирает номенклатуру по единственному значению свойства "Фланец" Результат: получил всю номенклатуру со свойством "Фланец" А что делать, когда нужно отобрать эти фланцы еще по нескольким свойствам, например "Диаметр", "Давление", "Марка" То есть хочу выбрать фланцы с заданным давлением, диаметром и маркой. Как бы уточненный отбор по свойствам. |
|||
130
ptiz
27.08.13
✎
10:57
|
(129)
Способ 1: добавлять еще соединения Способ 2: получить РС "ЗначенияСвойствОбъектов" во временную таблицу с отбором: Свойство В (&СписокНужныхСвойств), и дальше - как способ 1, но соединять уже с этой ВТ (тоже несколько соединений). Способ 3: получить РС "ЗначенияСвойствОбъектов" во временную таблицу с отбором: Свойство В (&СписокНужныхСвойств), но сразу делать разные поля с группировкой по полю "Объект". Например: ВЫБОР Объект, МАКСИМУМ(ВЫБОР КОГДА Свойство - &СвойствоФланец ТОГДА Значение ИНАЧЕ NULL КОНЕЦ) КАК Фланец, МАКСИМУМ(ВЫБОР КОГДА Свойство - &СвойствоДиаметр ТОГДА Значение ИНАЧЕ NULL КОНЕЦ) КАК Диаметр .. и потом обойтись одним соединением. Тут можно делать без ВТ, вложенным запросом. |
|||
131
oslokot
27.08.13
✎
11:05
|
(130) а можно поподробнее про получение РС в ВТ? как это пишется?
|
|||
132
ptiz
27.08.13
✎
11:07
|
ВЫБРАТЬ
Поле1, Поле2 ПОМЕСТИТЬ ВТ1 ИЗ Регистр.НашРегистр ; ВЫБРАТЬ Поле1, Поле2 ИЗ ВТ1 |
|||
133
oslokot
27.08.13
✎
11:15
|
(132) угу, спасиб. сейчас попробую
|
|||
134
oslokot
27.08.13
✎
11:58
|
нифига непойму
"ВЫБРАТЬ | ЗначенияСвойствОбъектов.Объект КАК Объект, | ЗначенияСвойствОбъектов.Свойство КАК Свойство |ПОМЕСТИТЬ ВТ |ИЗ | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов |ГДЕ | ЗначенияСвойствОбъектов.Свойство В(&СписокСвойств) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ.Свойство, | ВТ.Объект |ИЗ | ВТ КАК ВТ"; пустой запрос |
|||
135
oslokot
27.08.13
✎
12:03
|
И еще непонятно, как все это мне поможет?
Ведь выбирать надо значения из разных видов свойств. Свойство | Значение Тип | "Фланец" Диаметр | "50" Давление | "16" Марка | "нж" Нужно выбрать фланцы с диаметром 50, давлением 16 и маркой нж Как все это соединять, каша какая то в голове ( |
|||
136
ptiz
27.08.13
✎
12:08
|
Решение в лоб (способ 1): делать столько соединений, сколько свойств в условиях.
В каждом соединении будет условие вида: ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Фланец ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Фланец.Объект И ЗначенияСвойствОбъектов_Фланец.Свойство = &СвойствоФланец |
|||
137
Bober
27.08.13
✎
12:21
|
(129) попробуй поработать с СКД
|
|||
138
oslokot
27.08.13
✎
13:52
|
(137) рано пока для меня (
(136) вот так получилось (способ 1), работает хорошо: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Объект, | Номенклатура.Наименование КАК Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_ТипТПА | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_ТипТПА.Объект | И (ЗначенияСвойствОбъектов_ТипТПА.Свойство = &Свойство_ТипТПА) | И (ЗначенияСвойствОбъектов_ТипТПА.Объект ССЫЛКА Справочник.Номенклатура) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Диаметр | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Диаметр.Объект | И (ЗначенияСвойствОбъектов_Диаметр.Свойство = &Свойство_Диаметр) | И (ЗначенияСвойствОбъектов_Диаметр.Объект ССЫЛКА Справочник.Номенклатура) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Давление | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Давление.Объект | И (ЗначенияСвойствОбъектов_Давление.Свойство = &Свойство_Давление) | И (ЗначенияСвойствОбъектов_Давление.Объект ССЫЛКА Справочник.Номенклатура) |ГДЕ | ЗначенияСвойствОбъектов_ТипТПА.Свойство = &Свойство_ТипТПА | И ЗначенияСвойствОбъектов_ТипТПА.Значение = &Значение_ТипТПА | И ЗначенияСвойствОбъектов_Диаметр.Свойство = &Свойство_Диаметр | И ЗначенияСвойствОбъектов_Диаметр.Значение = &Значение_Диаметр | И ЗначенияСвойствОбъектов_Давление.Свойство = &Свойство_Давление | И ЗначенияСвойствОбъектов_Давление.Значение = &Значение_Давление | И НЕ Номенклатура.ПометкаУдаления | И НЕ Номенклатура.ЭтоГруппа | |УПОРЯДОЧИТЬ ПО | Номенклатура.Наименование"; Запрос.УстановитьПараметр("Свойство_ТипТПА", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Тип ТПА")); Запрос.УстановитьПараметр("Значение_ТипТПА", Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Фланец")); Запрос.УстановитьПараметр("Свойство_Диаметр", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Диаметр")); Запрос.УстановитьПараметр("Значение_Диаметр", Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Ду__50")); Запрос.УстановитьПараметр("Свойство_Давление", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Давление")); Запрос.УстановитьПараметр("Значение_Давление", Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Ру_16")); Вроде так? ничего лишнего я не наколбасил? Время выполнения составляет примерно 0.068 сек., как и в (129) Оставить так? Или это смотрится как быдло-код? |
|||
139
Ёпрст
27.08.13
✎
13:57
|
(138) выкинуть ГДЕ и все соедеиения.
Оставить только одно внутреннее соедиение. |
|||
140
Ёпрст
27.08.13
✎
13:58
|
, ну максимум, условие на Где НЕ Номенклатура.ПометкаУдаления
оставить. |
|||
141
oslokot
27.08.13
✎
14:06
|
(139) как это выкинуть.. А как же я в одном соединении укажу все условия разношерстных видов? не понимаю...
@Епрст покажи примерчик, пожалуйста |
|||
142
oslokot
27.08.13
✎
14:06
|
+ ну проверку ЭтоГруппа выкину, согласен. она не нужна
|
|||
143
oslokot
27.08.13
✎
14:18
|
(139) По типу такого чтоли?
"ВЫБРАТЬ | Номенклатура.Ссылка КАК Объект, | Номенклатура.Наименование КАК Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект | И (ЗначенияСвойствОбъектов.Свойство = &Свойство_ТипТПА) | И (ЗначенияСвойствОбъектов.Свойство = &Свойство_Диаметр) | И (ЗначенияСвойствОбъектов.Свойство = &Свойство_Давление) | И (ЗначенияСвойствОбъектов.Значение = &Значение_ТипТПА) | И (ЗначенияСвойствОбъектов.Значение = &Значение_Диаметр) | И (ЗначенияСвойствОбъектов.Значение = &Значение_Давление) | И (ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура) |ГДЕ | НЕ Номенклатура.ПометкаУдаления | |УПОРЯДОЧИТЬ ПО | Номенклатура.Наименование"; Только это естественно не работает |
|||
144
oslokot
27.08.13
✎
14:55
|
Итак. Выкинул все что можно, получилось так:
"ВЫБРАТЬ | Номенклатура.Ссылка КАК Объект, | Номенклатура.Наименование КАК Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_ТипТПА | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_ТипТПА.Объект | И (ЗначенияСвойствОбъектов_ТипТПА.Свойство = &Свойство_ТипТПА) | И (ЗначенияСвойствОбъектов_ТипТПА.Объект ССЫЛКА Справочник.Номенклатура) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Диаметр | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Диаметр.Объект | И (ЗначенияСвойствОбъектов_Диаметр.Свойство = &Свойство_Диаметр) | И (ЗначенияСвойствОбъектов_Диаметр.Объект ССЫЛКА Справочник.Номенклатура) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Давление | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Давление.Объект | И (ЗначенияСвойствОбъектов_Давление.Свойство = &Свойство_Давление) | И (ЗначенияСвойствОбъектов_Давление.Объект ССЫЛКА Справочник.Номенклатура) |ГДЕ | ЗначенияСвойствОбъектов_ТипТПА.Значение = &Значение_ТипТПА | И ЗначенияСвойствОбъектов_Диаметр.Значение = &Значение_Диаметр | И ЗначенияСвойствОбъектов_Давление.Значение = &Значение_Давление | И НЕ Номенклатура.ПометкаУдаления | |УПОРЯДОЧИТЬ ПО | Номенклатура.Наименование"; Вопрос, как выкинуть все соединения и оставить одно? |
|||
145
ptiz
27.08.13
✎
15:04
|
(144) Использовать "способ 3" :)
|
|||
146
oslokot
27.08.13
✎
15:08
|
(145) :) буду пробовать
Только вот еще одна неотложная проблема образовалась: Хочу выбирать, например, диаметр=50,60...80 и пусто! Загнал В список, все хорошо. Выбираются диаметры все, кроме пустых значений. А очень надо пустое. Как быть? |
|||
147
oslokot
27.08.13
✎
15:09
|
+ Понимаю, что в РС пустой записи с диаметром нет.
|
|||
148
viktor_vv
27.08.13
✎
15:09
|
(144)
| ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект | И (ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура) | И ((ЗначенияСвойствОбъектов.Свойство = &Свойство_ТипТПА) | ИЛИ (ЗначенияСвойствОбъектов.Свойство = &Свойство_Диаметр) | ИЛИ (ЗначенияСвойствОбъектов.Свойство = &Свойство_Давление) | ИЛИ (ЗначенияСвойствОбъектов.Значение = &Значение_ТипТПА) | ИЛИ (ЗначенияСвойствОбъектов.Значение = &Значение_Диаметр) | ИЛИ (ЗначенияСвойствОбъектов.Значение = &Значение_Давление)) |
|||
149
viktor_vv
27.08.13
✎
15:10
|
(148)+ Это в (143) изменить.
|
|||
150
viktor_vv
27.08.13
✎
15:13
|
(146) То есть тебе надо и незаполненные значения для назначенных свойств ? В этом случае в регистре записи не будет.
Это надо еще лепить туда назначение свойств. |
|||
151
oslokot
27.08.13
✎
15:18
|
(150) Да, незаполненные значения нужны тоже.
|
|||
152
Bober
27.08.13
✎
15:24
|
(151) ВНУТРЕННЕЕ СОЕДИНЕНИЕ замени на левое соединение и делай проверку на null, неопределено и пустое значение типа свойства
|
|||
153
ptiz
27.08.13
✎
15:26
|
(146) Тогда тебе нужно левое соединение, а условия вида
ЗначенияСвойствОбъектов_Диаметр.Свойство = &Свойство_Диаметр переместить в секцию ГДЕ таким образом: ГДЕ (ЗначенияСвойствОбъектов_Диаметр.Значение В(&СписокСвойства_Диаметр) ИЛИ ЗначенияСвойствОбъектов_Диаметр.Значение ЕСТЬ NULL) И ...другие отборы |
|||
154
oslokot
27.08.13
✎
15:27
|
(152) (153) Спасибо ребят, пробую...
|
|||
155
oslokot
27.08.13
✎
15:58
|
(153) Ура. Вот так взлетело:
"ВЫБРАТЬ | Номенклатура.Ссылка КАК Объект, | Номенклатура.Наименование КАК Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_ТипТПА | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_ТипТПА.Объект | И (ЗначенияСвойствОбъектов_ТипТПА.Свойство = &Свойство_ТипТПА) | И (ЗначенияСвойствОбъектов_ТипТПА.Объект ССЫЛКА Справочник.Номенклатура) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Диаметр | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Диаметр.Объект | И (ЗначенияСвойствОбъектов_Диаметр.Свойство = &Свойство_Диаметр) | И (ЗначенияСвойствОбъектов_Диаметр.Объект ССЫЛКА Справочник.Номенклатура) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Давление | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Давление.Объект | И (ЗначенияСвойствОбъектов_Давление.Свойство = &Свойство_Давление) | И (ЗначенияСвойствОбъектов_Давление.Объект ССЫЛКА Справочник.Номенклатура) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Марка | ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Марка.Объект | И (ЗначенияСвойствОбъектов_Марка.Свойство = &Свойство_Марка) | И (ЗначенияСвойствОбъектов_Давление.Объект ССЫЛКА Справочник.Номенклатура) |ГДЕ | ЗначенияСвойствОбъектов_ТипТПА.Значение = &Значение_ТипТПА | И (ЗначенияСвойствОбъектов_Диаметр.Значение = &Значение_Диаметр | ИЛИ ЗначенияСвойствОбъектов_Диаметр.Значение ЕСТЬ NULL ) | И (ЗначенияСвойствОбъектов_Давление.Значение = &Значение_Давление | ИЛИ ЗначенияСвойствОбъектов_Давление.Значение ЕСТЬ NULL ) | И (ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка) | ИЛИ ЗначенияСвойствОбъектов_Марка.Значение ЕСТЬ NULL ) | |УПОРЯДОЧИТЬ ПО | Номенклатура.Наименование"; То есть "Тип ТПА" оставил ВНУТРЕННИМ соединением, так как это свойство заполнено всегда, а "Диаметр", "Давление" и "Марка" сделал ЛЕВЫМ соединением с проверкой на NULL Работает. Всё правильно написано? |
|||
156
oslokot
27.08.13
✎
16:12
|
(155) + А еще, как в запросе включить/выключить условие на NULL? Просто нужно иногда выводить пустые, а иногда нет. Ту должна быть наверное конструкция типа
КОГДА &ВыводитьПустые ТОГДА ИНАЧЕ ИСТИНА... Так? |
|||
157
oslokot
27.08.13
✎
16:36
|
(156) + Или в восьмерке делается так же как в семерке?
Если ВыводитьПустые Тогда Запрос.Текст = Запрос.Текст + "..."; КонецЕсли; |
|||
158
ptiz
27.08.13
✎
16:43
|
(156) Да, лучше так.
|
|||
159
oslokot
27.08.13
✎
16:56
|
(158) да вот что-то с синтаксисом не так, или с моей ДНК :)
как эта конструкция применяется? Вот она: ВЫБОР КОГДА &ВыбранныйМноюПризнак = ИСТИНА ТОГДА Истина ИНАЧЕ <Текст условия запроса> КОНЕЦ Как ее применить например сюда: | И (ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка) | ИЛИ ЗначенияСвойствОбъектов_Марка.Значение ЕСТЬ NULL ) |
|||
160
oslokot
27.08.13
✎
17:06
|
(159) + а, всё, кажется догнал )
|
|||
161
Ёпрст
27.08.13
✎
17:11
|
можешь проще
внутреннее соединение по значение в список/массив значений и свойство в список/массив свойств усё. |
|||
162
Ёпрст
27.08.13
✎
17:15
|
ежели значения свойств могут совпадать у разного вида свойст, тогда через пары + или
По (свойство = свойство1 и значение = значение1) ИЛИ (свойство = свойство2 и значение = значение2) ... ИЛИ (свойство = свойствоN и значение = значениеN) |
|||
163
Ёпрст
27.08.13
✎
17:16
|
в итоге имеешь одно внутреннее соединение
|
|||
164
oslokot
27.08.13
✎
17:26
|
(163) Спасибо, это чуть позже попробую.
(159) Вот типа так сделал условие, работает вроде | И ВЫБОР | КОГДА &ВыводитьПустые | ТОГДА (ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка) | ИЛИ ЗначенияСвойствОбъектов_Марка.Значение ЕСТЬ NULL ) | ИНАЧЕ ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка) | КОНЕЦ Или что-то я опять перемудрил? |
|||
165
Bober
27.08.13
✎
17:37
|
ВЫБОР
КОГДА &ВыводитьПустые ТОГДА ЗначенияСвойствОбъектов_Марка.Значение ЕСТЬ NULL Иначе Истина Конец Или (ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка) |
|||
166
oslokot
27.08.13
✎
18:01
|
(165) Спасибо!
Получилось так: ВЫБОР КОГДА &ВыводитьПустые ТОГДА ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка) ИЛИ ЗначенияСвойствОбъектов_Марка.Значение ЕСТЬ NULL ИНАЧЕ ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка) КОНЕЦ Потому что мне нужно выводить при ВыводитьПустые=Истина не только пустые но и со значениями. |
|||
167
Bober
27.08.13
✎
18:12
|
(166) угу, неправильно написал кусок запроса в (165)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |