Имя: Пароль:
1C
 
подскажите с запросом к документам с услугами без товаров
0 dvrk
 
06.12.22
12:53
Привет, мне нужно выбрать документы, где в ТЧ Товары 0 строк, в ТЧ услуги >0 строк, как это в запросе указать?
1 Ryzeman
 
06.12.22
12:59
ВЫБРАТЬ РАЗЛИЧНЫЕ
ДокументТЧУслуги.Ссылка КАК СсылкаНаДокумент
ИЗ
Документ.МойДокумент.Услуги КАК ДокументТЧУслуги
ЛЕВОЕ СОЕДИНЕНИЕ Документ.МойДокумент.Товары КАК ДокументТЧТовары
ПО ДокументТЧУслуги.Ссылка = ДокументТЧТовары.Ссылка
ГДЕ
ДокументТЧТовары.Ссылка ЕСТЬ NULL
2 Ryzeman
 
06.12.22
12:59
Можно и лучше, но мне лень думать
3 Волшебник
 
модератор
06.12.22
13:00
ВЫБРАТЬ Ссылка ИЗ Документ.ИмяДок КАК Док
  ЛЕВОЕ СОЕДИНЕНИЕ Документ.ИмяДок.Товары КАК ТЧ_Товары
    ПО ТЧ_Товары.Ссылка = Док.Ссылка
ГДЕ ТЧ_Товары.Номенклатура ЕСТЬ NULL
  И Ссылка В (ВЫБРАТЬ РАЗЛИЧНЫЕ Ссылка ИЗ Документ.ИмяДок.Услуги)
4 dvrk
 
06.12.22
13:00
такое условие норм?
КОЛИЧЕСТВО(РеализацияТоваровУслуг.Товары.НомерСтроки) = 0
и КОЛИЧЕСТВО(РеализацияТоваровУслуг.Товары.НомерСтроки) > 0
5 Волшебник
 
модератор
06.12.22
13:01
(4) жесть
6 dvrk
 
06.12.22
13:02
(5) что
7 Kassern
 
06.12.22
13:13
(4) То что у вас одна ТЧ в условии это опечатка, или так задумано?)
8 Kassern
 
06.12.22
13:13
Какая конфигурация?
9 dvrk
 
06.12.22
13:15
(7) ну опечатался, УТ 10
КОЛИЧЕСТВО(РеализацияТоваровУслуг.Товары.НомерСтроки) = 0 И
    КОЛИЧЕСТВО(РеализацияТоваровУслуг.Услуги.НомерСтроки) > 0
10 Ryzeman
 
06.12.22
13:18
(9) Это будет работать но в разы дольше чем (1) или (3). Агрегатная функция в условии и те же два соединения как (3) но в условии.
11 dvrk
 
06.12.22
13:30
(10) спасибо
12 hockeyist
 
12.12.22
20:54
Трансформеры сказали:

ВЫБРАТЬ РАЗЛИЧНЫЕ ДокументТЧУслуги.Ссылка
ИЗ Документ.МойДокумент.Услуги КАК ДокументТЧУслуги
ГДЕ ДокументТЧУслуги.Ссылка НЕ В (ВЫБРАТЬ ДокументТЧТовары.Ссылка ИЗ Документ.МойДокумент.Товары КАК ДокументТЧТовары)

Неплохо вышло
13 hockeyist
 
12.12.22
21:13
Если быть точным, то

SELECT DISTINCT id FROM tab1 WHERE id NOT IN (SELECT id FROM tab2)

Это я уже на 1С-овский перевел
14 Said_We
 
12.12.22
22:50
(13) "(SELECT id FROM tab2)" можно тоже нарисовать "(SELECT DISTINCT id FROM tab2)".

Но автор в (4) в правильном направлении думал. По сути нужна хотя бы одна строка, поэтому можно вместо DISTINCT использовать условия для каждой из таблиц. Если по аналогии, то:

where tab1.НомерСтроки = 1

а для второй таблицы

where tab2.НомерСтроки = 1

Отработать должно ещё быстрее чем DISTINCT
15 hockeyist
 
12.12.22
22:56
(14) До этого GPT-3 не додумалась. Но все равно не плохо
16 Said_We
 
12.12.22
23:07
Писал на коленке. Если нигде не напортачил, то примерно так:

ВЫБРАТЬ
    тчУслуги.Ссылка
ИЗ
    Документ.МойДокумент.Услуги КАК тчУслуги
ГДЕ
      тчУслуги.НомерСтроки = 1
    И тчУслуги.Ссылка НЕ В (ВЫБРАТЬ т.Ссылка ИЗ Документ.МойДокумент.Товары КАК т ГДЕ т.НомерСтроки = 1)

Если вариант (1) тоже до левого соединения таблицы обрезать, то будет примерно такой же результат по времени как и "НЕ В (Выбрать...".
На мой взгляд, более читабельная и естественная конструкция "НЕ В (выбрать...".
Независимо от того, куда вы едете — это в гору и против ветра!