Имя: Пароль:
1C
1С v8
Язык запросов: Вопрос по соединениям (JOIN-ам)
0 Kaidend
 
21.03.13
10:56
Всем доброго дня.

Есть теоретический запрос по языку запросов и SQL. Букв, увы, много, вопрос не самый простой.  

"Классический" синтаксис JOIN-ов у нас такой. Опишу синтаксис, как умею, просьба не придираться к мелочам. Использовать буду англоязычный вариант, т. к. вопрос больше касается SQL, чем тонкостей его диалекта в 1С.

SELECT * FROM Table1 <INNER/LEFT/RIGHT/FULL> JOIN Table2 ON <Condition1> <INNER/LEFT/RIGHT/FULL> JOIN Table3 ON <Condition2>  и так далее.

Здесь как бы понятно, как оно работает. Сначала соединяются первые две таблицы по заданному условию, затем результат соединения первых двух с третьей. Была бы четвертая таблица - она бы соединялась с результатом соединения первых трех по последнему условию. Необязательно, конечно, что СУБД именно так и делает (оптимизиатор СУБД может и в другом порядке их соединять, по идее), но логически понять, интерпретировать запрос, чтобы понять, какой результат будет получен в итоге, можно так.

Работая с 1С, я впервые столкнулся с немного другим синтаксисом, который выдает конструктор запросов. У него такой вид:

SELECT * FROM Table1 <INNER/LEFT/RIGHT/FULL> JOIN Table2 <INNER/LEFT/RIGHT/FULL> JOIN Table3 ON <Condition1> ON <Condition2>.

То есть здесь все условия в конце расположены, а не сразу после указания таблицы, участвующей в соединении.

Интереса ради проверил, работает ли такой синтаксис на MS SQL (предположил сначала, что возможно, это чисто 1Совская особенность, которая приводится к нормальному виду перед отправкой запроса в СУБД). Работает.

Кто-нибудь может поделиться знанием, как правильно "понимать" такой синтаксис - т. е. уметь представлять, что получится в результате выполнения запроса? Может, кто-то видел ссылки на статьи или литературу, где описан такой синтаксис? Я во всех статьях и литературе видел описание только первого варианта синтаксиса...
1 Fragster
 
гуру
21.03.13
10:57
(0) в 1с такой же джоин, как и в остальных. сначала все вложенные, потом последовательные
2 acsent
 
21.03.13
10:57
(0) только если 2 соединение опирается на данные первого
3 Fragster
 
гуру
21.03.13
10:57
в мускуле и в мсскуле, по крайней мере работает джоин джоин он он
4 acsent
 
21.03.13
10:58
Кстати если переставить местами то конструктор нормально съест такое
5 lxndr
 
21.03.13
10:58
(0) Сначала соединяются вложенные соединения, с их результатом уже внешние.
6 Kaidend
 
21.03.13
11:00
(1), (5) А "Вложенные" - это какие?

В этом примере это соединение Table2 с Table3?

SELECT * FROM Table1 <INNER/LEFT/RIGHT/FULL> JOIN Table2 <INNER/LEFT/RIGHT/FULL> JOIN Table3 ON <Condition1> ON <Condition2>.
7 Fragster
 
гуру
21.03.13
11:03
сначала Table2 <INNER/LEFT/RIGHT/FULL> JOIN Table3 ON <Condition1>
8 Fragster
 
гуру
21.03.13
11:03
потом Table1 <INNER/LEFT/RIGHT/FULL> JOIN  результат ON <Condition2>.
9 Kaidend
 
21.03.13
11:05
(7), (8) Сейчас проверим...
10 Kaidend
 
26.03.13
17:30
Сейчас не получилось, но я все же проверил.
Действительно, все так и работает, как написано в (7) и (8).
В общем, схема ясна, как выполняются такие соединения.
Большое спасибо!