Полное соединение таблиц уменьшает количество строк

1. ksen 31.03.23 09:32 Сейчас в теме
ВЫБРАТЬ
	СУММА(ЕСТЬNULL(Закупки.Количество, 0)) КАК ВНаличииПриход,
	ЕСТЬNULL(ар1.Номенклатура, Закупки.АналитикаУчетаНоменклатуры.Номенклатура) КАК Номенклатура,
	СУММА(ар1.ВНаличииОстаток) КАК ВНаличииОстаток,
	СУММА(ар1.ВРезервеОстаток) КАК ВРезервеОстаток,
	СУММА(ар1.КОтгрузкеОстаток) КАК КОтгрузкеОстаток,
	СУММА(ар1.СейчасНаСкладе) КАК СейчасНаСкладе,
	СУММА(ар1.ВНаличииРасход) КАК ВНаличииРасход,
	СУММА(ар1.СуммаВыручки) КАК СуммаВыручки
ИЗ
	ар1 КАК ар1
		ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки КАК Закупки
		ПО ар1.Номенклатура = Закупки.АналитикаУчетаНоменклатуры.Номенклатура
ГДЕ
	Закупки.Период >= &НачалоПериода
	И Закупки.Период <= &КонецПериода
	И Закупки.ХозяйственнаяОперация В(&ХозяйственнаяОперация)

СГРУППИРОВАТЬ ПО
	ЕСТЬNULL(ар1.Номенклатура, Закупки.АналитикаУчетаНоменклатуры.Номенклатура)
Показать

Что я делаю не так? Почему не отображается не 1 строки с пустой ячейкой ВНаличииПриход
По теме из базы знаний
Найденные решения
10. karamazoff 123 31.03.23 10:06 Сейчас в теме
(9)соединения таблиц плохо дружат с где, либо пишите условие в самом соединении, либо, как написали выше, через временные таблицы
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Sashares 33 31.03.23 09:50 Сейчас в теме
(1)У вас в условии ГДЕ отбор по таблице Закупки.
А значит у вас уже не полное соединение, а внутреннее получается в результате.
Сначала со временную таблицу отберите нужные записи из РН, а потом уже в следующем запросе соединяйте.
5. ksen 31.03.23 09:51 Сейчас в теме
(4)хм, получается надо сначала сделать отбор в вирт таблицу, а только потом уже делать полное соединение, так?
6. Sashares 33 31.03.23 09:52 Сейчас в теме
7. ElGatoGris 31.03.23 09:54 Сейчас в теме
(6)Но при этом всё равно ведь произойдёт "уменьшение количества строк" и строки, где Количество=0 не попадут в результат?
8. Sashares 33 31.03.23 09:56 Сейчас в теме
13. ElGatoGris 31.03.23 10:25 Сейчас в теме
(8)Часть строк отсечётся по условию ГДЕ и не будет участвовать в полном соединении.
14. Sashares 33 31.03.23 10:36 Сейчас в теме
(13)То что отсечется по условию ГДЕ и не нужны для соединения.
При полном соединении будут строки как из левой таблицы, так и из правой.
Поэтому не важно, есть ли строки с количеством = 0 в выбранных записях РН.
15. ElGatoGris 31.03.23 10:54 Сейчас в теме
(14) Автор вопрошает "куда же делись строки?". Предполагаю, что в этом конкретном случае они оказались среди тех, что не подошли по условию ГДЕ. Возможно, стоит глянуть на реестр глазами, и посмотреть, действительно ли за указанный период и при данных хозяйственных операциях есть движения с Количество=0.
16. Sashares 33 31.03.23 10:59 Сейчас в теме
(15)
Предполагаю, что в этом конкретном случае они оказались среди тех, что не подошли по условию ГДЕ.

Да.
Поэтому сначала нужно отобрать, а потом соединять.
Либо перенести условие из ГДЕ в соединение, как писали ниже.
17. spacecraft 31.03.23 11:06 Сейчас в теме
(15) тут весь смысл в том, что вначале отобрать с условием, а потом соединять полученное по соединению таблиц, но без условий. Тогда строки не пропадут.
Но проще условия перенести в соединение
2. ElGatoGris 31.03.23 09:43 Сейчас в теме
А в реестре Закупки есть движения, где Количество=0?
3. ksen 31.03.23 09:49 Сейчас в теме
(2)да, есть номенклатура, которая не попадает в период закупок, но есть в таблице ар1
9. ElGatoGris 31.03.23 10:03 Сейчас в теме
(3)Есть-то она там есть, но вы какую-то часть строк отсекаете условием ГДЕ.
10. karamazoff 123 31.03.23 10:06 Сейчас в теме
(9)соединения таблиц плохо дружат с где, либо пишите условие в самом соединении, либо, как написали выше, через временные таблицы
11. minarenko 31.03.23 10:09 Сейчас в теме
(10) а что мешает условия из где перенести в соединение?

ВЫБРАТЬ
    СУММА(ЕСТЬNULL(Закупки.Количество, 0)) КАК ВНаличииПриход,
    ЕСТЬNULL(ар1.Номенклатура, Закупки.АналитикаУчетаНоменклатуры.Номенклатура) КАК Номенклатура,
    СУММА(ар1.ВНаличииОстаток) КАК ВНаличииОстаток,
    СУММА(ар1.ВРезервеОстаток) КАК ВРезервеОстаток,
    СУММА(ар1.КОтгрузкеОстаток) КАК КОтгрузкеОстаток,
    СУММА(ар1.СейчасНаСкладе) КАК СейчасНаСкладе,
    СУММА(ар1.ВНаличииРасход) КАК ВНаличииРасход,
    СУММА(ар1.СуммаВыручки) КАК СуммаВыручки
ИЗ
    ар1 КАК ар1
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки КАК Закупки
        ПО ар1.Номенклатура = Закупки.АналитикаУчетаНоменклатуры.Номенклатура
    И Закупки.Период >= &НачалоПериода
    И Закупки.Период <= &КонецПериода
    И Закупки.ХозяйственнаяОперация В(&ХозяйственнаяОперация)

СГРУППИРОВАТЬ ПО
    ЕСТЬNULL(ар1.Номенклатура, Закупки.АналитикаУчетаНоменклатуры.Номенклатура)
Показать
12. karamazoff 123 31.03.23 10:10 Сейчас в теме
(11)ну дык я же так и предложил
18. ElGatoGris 31.03.23 11:23 Сейчас в теме
(16) Насколько я понимаю, перенос условия из ГДЕ в соединение даст иной результат. В итоговую таблицу таки попадут движения, не попавшие в условие отбора по периоду. Может автору это и нужно.
19. ksen 31.03.23 11:47 Сейчас в теме
Спасибо всем ответившим, искренне не понимаю почему в запросах к бд, не выполнять сначала Выборку, потом объединение. Весь смысл полного соединения теряется.
20. spacecraft 31.03.23 12:16 Сейчас в теме
(19) секция ГДЕ выполняется уже на результат соединения, если оптимизатор не переделает. Но оптимизатор не будет делать то, что изменит результат.
21. Sashares 33 31.03.23 13:35 Сейчас в теме
(19)Потому что сначала выполняется соединение, а потом отбор из секции ГДЕ.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот