Имя: Пароль:
1C
1С v8
Исключить из результатов запроса данные, которые - результат другого запроса
,
0 Fedor
 
17.01.12
19:26
Есть запрос. Его результатом является определенное кол-во строк. Но маленький набор строк из него нужно исключить. Этот маленький набор строк можно получить другим запросом.
Как правильнее реализовать єто задачу? Сделать вложенный запрос? Можно ли в этом случае объединить основную и вложенную таблицы так, чтоб из основного набора данных исключались данные второго запроса?
Или лучше сделать Запрос пакета 2, и проверять чтоб данные первого набора данных были НЕ В втором наборе?
1 vde69
 
17.01.12
19:50
левое соединение и условие "где маленькийСписок.Поле есть null"
2 Fedor
 
17.01.12
19:57
(1) Спасибо!
3 Дядя Васька
 
17.01.12
20:05
(1) Ваще не понял как это сработает...
4 Дядя Васька
 
17.01.12
20:07
+(3) Вроде ж по левому должны войти все строки большого запроса, и те из маленького, которые соответствуют условию соединения. Может внутреннее?
5 Fedor
 
17.01.12
20:16
(4) Левое соединение - в Основном наборе данных.
6 Fedor
 
17.01.12
20:16
И условие - тоже для осоновного запроса
7 Дядя Васька
 
17.01.12
20:28
(6) Тогда не совсем понятно чем плохо НЕ В, вроде так более громоздко получается.
8 le_
 
17.01.12
20:31
выбрать А из т1 где не А в (выбрать Б из т2)
9 vde69
 
17.01.12
22:10
(8) использовать "В" имеет смысл только в условии джойна...

в (1) самый оптимальный путь, по сколько джойн большого с малым очень быстрый и проверка на нулл в конце то-же быстрая
10 Дядя Васька
 
17.01.12
22:49
(9) Так условие все-таки в джойне или в в ГДЕ, в верхнем запросе? Я так понял что получается бесполезный джойн (новых колонок не добавляется) а потом уже в ГДЕ условие на невхождение во вложенный запрос.
11 vde69
 
17.01.12
23:17
(10) проверка на нулл конечно в секции "где", то есть сначало джойн а потом условие на нулл по маленькой таблице, тем самым мы оставим только записи из большой таблице которых нет в маленькой
12 Дядя Васька
 
18.01.12
08:17
(11) Ну и казалось бы зачем тут джойн, если нужна только проверка...
13 kosts
 
18.01.12
08:26
(12) Есть вариант как по другому сделать?
14 Starhan
 
18.01.12
08:28
(13)
в(12) прделагает сразу проверку наложить на невхождение в список из подзапроса.

Вопрос только в том, что быстрее будет соедеинение и простой отбор НЕ Есть Null
или отбор с условием Не В (список из подзапроса)
15 kosts
 
18.01.12
08:37
(14) А ну да иногда можно и так ...
Я за джойн.
16 Дядя Васька
 
18.01.12
08:57
(14),(15) Вопрос имеет смысл если этот джойн сам лишние строки уберет, то есть будет не левый, а внутренний и за счет условий соединения в итоговой таблице останется только то что надо, в данном же случае он этого не делает, и используется только для того чтобы в основном запросе можно было обратиться к полю вложенного. Что в общем-то и не нужно.
17 le_
 
18.01.12
09:36
(9) Почему?
Чем такой запрос плох?
ВЫБРАТЬ
   Контрагенты.Ссылка КАК Контрагент
ИЗ
   Справочник.Контрагенты КАК Контрагенты
ГДЕ
   (НЕ Контрагенты.ПометкаУдаления)
   И (НЕ Контрагенты.ЭтоГруппа)
   И (НЕ Контрагенты.Ссылка В
               (ВЫБРАТЬ
                   ЗаказПокупателя.Контрагент
               ИЗ
                   Документ.ЗаказПокупателя КАК ЗаказПокупателя
               ГДЕ
                   (НЕ ЗаказПокупателя.ПометкаУдаления)))
18 kosts
 
18.01.12
10:43
(16) (17) Неудобство в сопоставлении реквизитов, что если связать нужно будет не по ссылке, а одновременно еще и по дате.
К тому же фирма 1С рекомендует так не делать, т.к. возможно появление тормозов...
В общем на выбор.
19 Midzgun
 
18.01.12
10:47
За Джоин. Однозначно быстрее!
20 Дядя Васька
 
18.01.12
11:19
(18) Ну так джойн надо внутренний использовать, а не левый. В условиях соединения все и проверять, чтобы именно он убрал лишнее. А с левым те же яйца только в профиль, все равно в where проверка, а не в on.
21 kosts
 
18.01.12
21:26
(20) Вот запрос от балды, хочется увидеть вариант с внутренним соединением (для самообразования так сказать).
Получить не праздничные дни из графика

ВЫБРАТЬ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ПОМЕСТИТЬ ВТПразднечныеДни
ИЗ
   РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= &ДатаНачала
   И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= &ДатаОкончания
   И РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Праздник)

ИНДЕКСИРОВАТЬ ПО
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ГрафикиРаботыПоВидамВремени.ГрафикРаботы,
   ГрафикиРаботыПоВидамВремени.Дата,
   ГрафикиРаботыПоВидамВремени.ОсновноеЗначение
ИЗ
   РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
       ЛЕВОЕ СОЕДИНЕНИЕ ВТПразднечныеДни КАК ВТПразднечныеДни
       ПО ГрафикиРаботыПоВидамВремени.Дата = ВТПразднечныеДни.ДатаКалендаря
ГДЕ
   ГрафикиРаботыПоВидамВремени.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
   И ГрафикиРаботыПоВидамВремени.ГрафикРаботы = &ГрафикРаботы
   И ГрафикиРаботыПоВидамВремени.План
   И ВТПразднечныеДни.ДатаКалендаря ЕСТЬ NULL