Имя: Пароль:
1C
 
1С 8.3 Странный синтаксис левого соединения
0 СамоСабой
 
14.05.24
13:02
Здравствуйте.
Имеется запрос
|Выбрать
|    Покупатель.НомерДома КАК ПокупательНомерДома,
|    Поставщик.улица КАК ПоставщикУлица,
|    Поставщик.номерДома КАК ПоставщикНомерДома,
|    Поставщик.ТипДома КАК ПоставщикТипДома,
|    Продавец.улица КАК ПродавецУлица,
|    Продавец.номерДома КАК ПродавецНомерДома,
|    Продавец.ТипДома КАК ПродавецТипДома,
|    ТочкаДоставки.Улица КАК ТочкаДоставкиУлица,
|    ТочкаДоставки.НомерДома КАК ТочкаДоставкиНомерДома,
|    ТочкаДоставки.ТипДома КАК ТочкаДоставкиТипДома,
|    ЕСТЬNULL(КонечныйПокупатель.индекс, """") КАК КонечныйПокупательИндекс,
|    ЕСТЬNULL(КонечныйПокупатель.город, """") КАК КонечныйПокупательГород,
|    ЕСТЬNULL(КонечныйПокупатель.Поле5, """") КАК КонечныйПокупательНасПункт,
|    ЕСТЬNULL(КонечныйПокупатель.Улица, """") КАК КонечныйПокупательУлица,
|    ЕСТЬNULL(КонечныйПокупатель.НомерДома, """") КАК КонечныйПокупательНомерДома,
|    ЕСТЬNULL(КонечныйПокупатель.ТипДома, """") КАК КонечныйПокупательТипДома
|ИЗ
|    Покупатель КАК Покупатель
|    ЛЕВОЕ СОЕДИНЕНИЕ КонечныйПокупатель КАК КонечныйПокупатель
|        ПО (ИСТИНА),
|    ТочкаДоставки КАК ТочкаДоставки,
|    Плательщик КАК Плательщик,
|    Продавец КАК Продавец,
|    Поставщик КАК Поставщик
1 Волшебник
 
14.05.24
13:04
Какой вопрос-то?
2 СамоСабой
 
14.05.24
13:07
Тут Покупатель,КонечныйПокупатель, ТочкаДоставки, Платильщик,Продавец,Поставщик - это временные таблицы
Конструктор запроса ошибок не находит
Не понятно, что означают перечисленные через запятую таблицы в :
ЛЕВОЕ СОЕДИНЕНИЕ КонечныйПокупатель КАК КонечныйПокупатель
|        ПО (ИСТИНА),
|    ТочкаДоставки КАК ТочкаДоставки,
|    Плательщик КАК Плательщик,
|    Продавец КАК Продавец,
|    Поставщик КАК Поставщик
Теоретически тут должно быть условия связи, а как понять приведенное выше.
Прошу подсказать
3 Волшебник
 
14.05.24
13:07
Это какой-то бред от такого же генератора бреда как и Вы.
4 СамоСабой
 
14.05.24
13:08
Этот бред - работает без ошибок
5 Волшебник
 
14.05.24
13:11
(4) Это не отменяет его статуса как бреда. Можно навалить тонны кода, которые будут выполняться, но тупо не нужны.
6 СамоСабой
 
14.05.24
13:12
Синтаксически тут все правильно - что это означает - не понятно
7 Волшебник
 
14.05.24
13:12
(6) Удалите.
8 СамоСабой
 
14.05.24
13:21
Похоже я догадался - это декартово произведение всех перечисленных таблиц, первая из которых - левое соединение.
Причем оно тоже фактически является декартовым -т.к. условие связи = ИСТИНА всегда.

Если я правильно понимаю то декартово произведение дает не пустую таблицу только тогда когда во всех сомножителях есть хотябы одна запись.
9 DJ Anthon
 
14.05.24
13:22
(5) в типовых полно соединений по истина, в чем бред-то? может, проще было бы по-другому, но хз, может, там шаблоны запросов формируются программно
10 DJ Anthon
 
14.05.24
13:22
(8) декартово произведение таблиц - это полное соединение, а тут левое. к одной таблице подтягивается другая таблица без условий. скорее всего, в них всего по одной записи и они склеиваются.
11 MMB
 
14.05.24
13:29
На сколько я понимаю когда таблицы перечислены через запятую то это полное соединение. Можно написать
|    ПОЛНОЕ СОЕДИНЕНИЕ ТочкаДоставки КАК ТочкаДоставки ПО ИСТИНА,

получится то же самое, т.е. декартово произведение.
В запросах это имеет смысл только если в присоединяемых таким образом таблицах находится только одна строка, например значение какой-то константы - в этом случае количество записей не увеличится, просто добавится колонка. Это может быть нужно если ,например, в запрос внутри СКД нужно добавить значение константы чтобы использовать его в условиях или вычислениях, но при этом заполнять параметры или использовать функции общих модулей не хочется.

Ну собственно пока я писал уже разобрались.
12 Ёпрст
 
14.05.24
13:40
(0)
>>>Не понятно, что означают перечисленные через запятую таблицы в
cross join
13 Мультук
 
гуру
14.05.24
13:54
(0)

По тексту, читайте стандарты SQL -- они рулез.
Ну хот я бы
wiki:Join_(SQL)

P.S.

Давным-давно, в далекой...

Вместо inner join писали вот так (см ниже)
Потом стандарты стали дополнять, улучшать.

SELECT *
FROM
  Person,
  City
WHERE
  Person.CityId = City.Id
14 СамоСабой
 
14.05.24
13:53
Тут прикол в том, что во всех таблицах должна быть хотябы одна запись, а КонечныйПокупатель - может быть пусто
15 Смотрящий
 
14.05.24
13:57
(0) Работает ? Не трожъ !!
16 СамоСабой
 
14.05.24
14:03
(15) СамоСабой
17 Мультук
 
гуру
14.05.24
14:05
(14)

>> КонечныйПокупатель - может быть пусто

И ради этого "там" написано ЛЕВОЕ СОЕДИНЕНИЕ ПО {похрен, все на всех. ИСТИНА}

До сих пор чего-то не понятно?

P.S.
Шёл ёжик по лесу, забыл как работает sql и умер...