|
полное совпадение таблиц | ☑ | ||
---|---|---|---|---|
0
Dom26
06.12.17
✎
16:23
|
естьмассив справочников А, и Есть справочник Б где ТЧ из Элементов Спр А, как проще всего запросом найти Элемент Б, где список точно совпадает с Массивом А (ни больше ни меньше)
|
|||
1
Петрович 2018
06.12.17
✎
16:25
|
(0) Запросом жеж!
|
|||
2
Dom26
06.12.17
✎
16:26
|
(1) так а как проще всего?
|
|||
3
Ц_У
06.12.17
✎
16:27
|
(2) так и говори, напишите за меня запрос
|
|||
4
Dom26
06.12.17
✎
16:29
|
(3) я могу написать, но че то больно мудрено выходит, в кучу пакетов
|
|||
5
Ц_У
06.12.17
✎
16:32
|
(4) покажи, а мы посмотрим
|
|||
6
Serg_1960
06.12.17
✎
16:35
|
(4) Sorry, но Вы тоже заумно-мудрёно мысли свои излагаете. Расшифруйте, например, непонятно-двоякосмысловое словосочетание "массив массив справочников А"?
Если подключить присущую мне в полной мере интуицию, то вероятно это "массив [записей] справочника[ед.ч] А"? |
|||
7
Ildarovich
06.12.17
✎
22:54
|
Вот на примере справочника "Контрагенты" (Как справочник Б). Приведенным запросом находятся контрагенты, у которых в табличной части имеются менеджеры из справочника "Пользователи" (Справочник А), список которых точно определен массивом &Массив. Требуется заранее определить размер массива и передать его в параметр &МассивКоличество.
ВЫБРАТЬ
|
|||
8
Tateossian
06.12.17
✎
23:23
|
(4) Если отбросить из примера виртуальные таблицы, получается два. Можно вложенными запросами.
ВЫБРАТЬ "ТЧЭлементА" КАК ЭлементОтбора ПОМЕСТИТЬ МассивОтбора ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "ТЧЭлементБ" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "ТЧЭлементВ" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ "ШапкаА" КАК СсылкаА, "ТЧЭлементА" КАК ЭлементТЧ ПОМЕСТИТЬ ВиртСправочник ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "ШапкаА", "ТЧЭлементБ" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "ШапкаА", "ТЧЭлементВ" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "ШапкаБ", "ТЧЭлементА" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "ШапкаБ", "ТЧЭлементГ" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВиртСправочник.СсылкаА ПОМЕСТИТЬ НеУдовлетворяющие ИЗ МассивОтбора КАК МассивОтбора ПОЛНОЕ СОЕДИНЕНИЕ ВиртСправочник КАК ВиртСправочник ПО (ВиртСправочник.ЭлементТЧ = МассивОтбора.ЭлементОтбора) ГДЕ МассивОтбора.ЭлементОтбора ЕСТЬ NULL СГРУППИРОВАТЬ ПО ВиртСправочник.СсылкаА ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВиртСправочник.СсылкаА КАК Отобранные ИЗ ВиртСправочник КАК ВиртСправочник ЛЕВОЕ СОЕДИНЕНИЕ НеУдовлетворяющие КАК НеУдовлетворяющие ПО ВиртСправочник.СсылкаА = НеУдовлетворяющие.СсылкаА ГДЕ НеУдовлетворяющие.СсылкаА ЕСТЬ NULL СГРУППИРОВАТЬ ПО ВиртСправочник.СсылкаА Можешь этот вариант проверить. Концептуально делаешь полное соединение, выбираешь те ссылки справочника, у которых есть NULL (то есть, не все совпали). Затем полученное множество соединяешь со всем справочником, удаляя элементы предыдущего подзапроса (исключая, то есть). Останутся нужные. |
|||
9
Tateossian
06.12.17
✎
23:31
|
(8) Погоди, еще одна проверка нужна, если все элементы целевого справочника лежат в массиве. Не работает в этом случае.
|
|||
10
Лефмихалыч
06.12.17
✎
23:48
|
ВЫБРАТЬ А.а, Б.б
ИЗ А полное соединение Б по А.а=Б.б ГДЕ А.а есть null ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ А.а, Б.б ИЗ А полное соединение Б по А.а=Б.б ГДЕ Б.б есть null Если этот запрос что-то вернул, значит таблицы не совпадают. Можно вместо объединения ИЛИ, но на взрослых данных это ИЛИ может угондонить производительность запроса. |
|||
11
Tateossian
07.12.17
✎
00:22
|
(10) Да, тоже потом понял ошибку - нужно декартово произведение
Для моего варианта будет выглядеть так (чтобы без ИЛИ) ВЫБРАТЬ РАЗЛИЧНЫЕ МассивОтбора.ЭлементОтбора, ВиртСправочник.СсылкаА ПОМЕСТИТЬ ВсеИскомые ИЗ МассивОтбора КАК МассивОтбора, ВиртСправочник КАК ВиртСправочник ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ВиртСправочник.СсылкаА СсылкаРезульт ИЗ ВиртСправочник КАК ВиртСправочник ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВЗ.СсылкаА КАК СсылкаА, ВЗ.ЭлементТЧ КАК ЭлементТЧ, СУММА(ВЗ.Рез) КАК Рез ИЗ (ВЫБРАТЬ ВиртСправочник.СсылкаА КАК СсылкаА, ВиртСправочник.ЭлементТЧ КАК ЭлементТЧ, 1 КАК Рез ИЗ ВиртСправочник КАК ВиртСправочник ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВсеИскомые.СсылкаА, ВсеИскомые.ЭлементОтбора, -1 ИЗ ВсеИскомые КАК ВсеИскомые) КАК ВЗ СГРУППИРОВАТЬ ПО ВЗ.СсылкаА, ВЗ.ЭлементТЧ ИМЕЮЩИЕ СУММА(ВЗ.Рез) <> 0) КАК ВЗ ПО ВиртСправочник.СсылкаА = ВЗ.СсылкаА ГДЕ ВЗ.СсылкаА ЕСТЬ NULL |
|||
12
Dom26
07.12.17
✎
09:05
|
ВЫБРАТЬ
ГруппыЦБСписокЦБ.Ссылка КАК Ссылка, МАКСИМУМ(ГруппыЦБСписокЦБ.НомерСтроки) КАК НомерСтроки ПОМЕСТИТЬ ГруппыЦбПоКолву ИЗ Справочник.ГруппыЦБ.СписокЦБ КАК ГруппыЦБСписокЦБ СГРУППИРОВАТЬ ПО ГруппыЦБСписокЦБ.Ссылка ИМЕЮЩИЕ МАКСИМУМ(ГруппыЦБСписокЦБ.НомерСтроки) = &кол ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВложенныйЗапрос.Ссылка) КАК Ссылка, ГруппыЦБСписокЦБ.Ссылка КАК Ссылка1 ИЗ (ВЫБРАТЬ СтатьиОборотовПоБюджетам.Ссылка КАК Ссылка ИЗ Справочник.СтатьиОборотовПоБюджетам КАК СтатьиОборотовПоБюджетам ГДЕ СтатьиОборотовПоБюджетам.Ссылка В (&Массив)) КАК ВложенныйЗапрос ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыЦБ.СписокЦБ КАК ГруппыЦБСписокЦБ ПО ВложенныйЗапрос.Ссылка = ГруппыЦБСписокЦБ.ЦБ ГДЕ ГруппыЦБСписокЦБ.Ссылка В (ВЫБРАТЬ ГруппыЦбПоКолву.Ссылка КАК Ссылка ИЗ ГруппыЦбПоКолву КАК ГруппыЦбПоКолву) СГРУППИРОВАТЬ ПО ГруппыЦБСписокЦБ.Ссылка ИМЕЮЩИЕ КОЛИЧЕСТВО(различные ВложенныйЗапрос.Ссылка) = &кол где кол количество эл в массиве |
|||
13
Dom26
07.12.17
✎
13:38
|
вот самый короткий с количеством
ВЫБРАТЬ РАЗЛИЧНЫЕ ГруппыЦБСписокЦБ.Ссылка КАК ГруппаЦБ, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГруппыЦБСписокЦБ.ЦБ) КАК ЦБ ИЗ Справочник.ГруппыЦБ.СписокЦБ КАК ГруппыЦБСписокЦБ ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыЦБ КАК ГруппыЦБ ПО ГруппыЦБСписокЦБ.Ссылка = ГруппыЦБ.Ссылка ГДЕ ГруппыЦБСписокЦБ.ЦБ В(&Массив) И ГруппыЦБСписокЦБ.Ссылка.КоличествоЦБ = &Кол СГРУППИРОВАТЬ ПО ГруппыЦБСписокЦБ.Ссылка ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГруппыЦБСписокЦБ.ЦБ) = &Кол |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |