|
Язык запросов: Вопрос по соединениям (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). В общем, схема ясна, как выполняются такие соединения. Большое спасибо! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |