Имя: Пароль:
1C
 
Есть ли в 1С приоритет соединений в запросе. Если да, то какой он, подскажите.
0 YauheniL
 
27.01.10
12:15
Собственно, сабж.

Поясню на примере: есть 3 множества А, Б, В. Множества А и Б соединены левым соединением, а множества Б и В внутренним. Что получится в итоге, если порядок записи запроса такой:

А <LEFT JOIN> Б <INNER JOIN> В
1 Sadovnikov
 
27.01.10
12:17
Да что ж такое творится-то уже второй день, а?
2 mikecool
 
27.01.10
12:18
(0) конструктор в руки, что нельзя сделать - не даст
3 YauheniL
 
27.01.10
12:20
(1) А что второй день творится? Ыбл в коммандировке, не в курсе
(2) Конструктор дает такое сделать

З.Ы. сделал через вложенные запросы, сабж создал из интереса. У нас с коллегой дискуссия
4 Sadovnikov
 
27.01.10
12:21
(3) Что творится? Ни думать, ни читать, ни пробовать не хотят. А вот дурацкий вопрос задать - да запожалуйста!
5 Дикообразко
 
27.01.10
12:22
(4) а здесь бывает иначе?
6 Sadovnikov
 
27.01.10
12:23
(5) Как минимум, вот такого:
Дата регистрации: 27.01.2010     сегодня  
Сообщений: 68  
что-то не припомню.
7 Дикообразко
 
27.01.10
12:25
(6) да ладно уж, ты сюда глянь http://www.forum.mista.ru/rating.php
8 Sadovnikov
 
27.01.10
12:27
(7) И на что именно мне там посмотреть?
9 Дикообразко
 
27.01.10
12:30
(8) на количество сообщений за 15 дней  и учитывай, то что в выходные обычно не пишут :)
10 Sadovnikov
 
27.01.10
12:31
(9) На стаж писателей посмотри. Дедовщина тут.
11 YauheniL
 
27.01.10
12:32
(6) Если бы я мог найти ответ на этот вопрос, я бы не создавал тему. Мне приходит в голову 2 варианта:
1. Я получу левое соединение А и В, в силу приоритета INNER JOIN
2. Я получу внутреннее соединение А и В, если у INNER JOIN приоритета нет.
12 Sadovnikov
 
27.01.10
12:33
(11) А если ты чуток подумаешь, что поймешь, что абсолютно по барабану, в каком порядке условия выполняться будут.
13 Дикообразко
 
27.01.10
12:33
(10) а с чего ты решил, что у меня стаж маленький?
14 Sadovnikov
 
27.01.10
12:34
(13) А не люблю клонов...
15 Дикообразко
 
27.01.10
12:35
(14) я тоже
16 Дикообразко
 
27.01.10
12:35
и я не клон
17 los_hooliganos
 
27.01.10
12:37
(11) о, еще одного к основам реляционной алгебры.
18 Мохнатое рыло
 
27.01.10
12:38
(16) И кто же ты?
19 bvn13
 
27.01.10
12:38
(0) в 1С приоритет сверху вниз и изнутри наружу
20 YauheniL
 
27.01.10
12:38
(17) надо будет на досуге перечитать. Уже вчера словил себя на этом.
(19) Спасибо
21 Егор Сергеевич
 
27.01.10
12:39
(16) ты суррогат или аватар?
22 Дикообразко
 
27.01.10
12:40
(21) да
23 Kaidend
 
27.01.10
12:46
(12) Кстати, а почему по барабану?
Представим, что множество А = {1, 2, 3}, Б = {3, 4, 5}, В = {5, 6, 7}
Если сначала выполяется внутреннее соединение Б и В, то получается {5}, левое соединение с А дает {1, 2, 3, 5}
Если сначала выполняется левое соединение А и Б, то получаем {1, 2, 3}, внутреннее соединение с В дает пустое множество.
24 Живой Ископаемый
 
27.01.10
12:47
запарили флудом в тематической ветке!
25 Kaidend
 
27.01.10
12:48
Вообще, никогда специально не интересовался, но почему-то был уверен, что в SQL все соединения выполняются строго последовательно - в том порядке, в каком они написаны в запросе.

Надо сказать, что конструктор запросов избавляет от необходимости думать о таких вещах.
26 Shurjk
 
27.01.10
12:48
(23) Они не выполняются сначала одно а потом другое - если конечно не использовать позапросы, нарисуй эти таблички на бумажке и все сразу станет понятно
27 Sadovnikov
 
27.01.10
12:50
(23) А ты проверь :)
28 Kaidend
 
27.01.10
12:51
(27) Что проверить-то?
29 Sadovnikov
 
27.01.10
12:53
(28) Связывания.
30 Shurjk
 
27.01.10
12:53
(28) Конечно ведь и так все понятно:)))
Поражает не незнание, а не желание и неумение учиться....
31 acsent
 
27.01.10
12:53
{1, 2, 3} LEFT JOIN ({3, 4, 5} INNER JOIN {5, 6, 7}) = {1, 2, 3} LEFT JOIN {5} = {1, 2, 3}
32 acsent
 
27.01.10
12:55
({1, 2, 3} LEFT JOIN {3, 4, 5}) INNER JOIN {5, 6, 7} = {1, 2, 3} INNER JOIN {5, 6, 7} = 0
33 Shurjk
 
27.01.10
13:04
(31) Интересно почему он должен соединять не таблицы а результат первого соединения?
34 acsent
 
27.01.10
13:04
Может кто-нибудь эксперимент проведет?
35 acsent
 
27.01.10
13:05
Хотя нет, мы же указываем к какой конкретно таблице джойним
36 Kaidend
 
27.01.10
13:06
Я попробовал. В общем-то, да, в SQL-синтаксисе секция FROM описывает последовательное соединения таблиц и фильтры по тому, что получилось в результате соединения.

Так что вопроса в (0) приминительно к SQL возникать не должно.
37 Sadovnikov
 
27.01.10
13:06
(34) Зачем???
38 1c_asp
 
27.01.10
13:09
(19) Вы чо, издеваетесь, какой нах... "приоритет в 1С" ? А если у версия SQL, то каким образом 1С будет командовать SQL сервером, что с чем и каким приорететом соединять ?
39 H A D G E H O G s
 
27.01.10
13:10
Я вот тоже удивляюсь, какой здесь приоритет может быть
40 Kaidend
 
27.01.10
13:15
Кстати, все-таки интересно.

Вот пример запроса из 1С

ВЫБРАТЬ
   Таблица1.ПолеСтрока,
   Таблица2.ПолеСтрока КАК ПолеСтрока1,
   Таблица3.ПолеСтрока КАК ПолеСтрока2
ИЗ
   РегистрСведений.Таблица1 КАК Таблица1
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Таблица2 КАК Таблица2
       ПО Таблица1.ПолеСтрока = Таблица2.ПолеСтрока
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Таблица3 КАК Таблица3
           ПО Таблица2.ПолеСтрока = Таблица3.ПолеСтрока


Из самого текста понятно, что последнее внутреннее соединение выполняется с тем, что получилось после соединения таблицы1 с таблицей 2 и наложения условия.

А вот "в теории" (в реляционной алгебре) все-таки есть какой-то приоритет или выполняется все последовательно? Вот в (0) как раз хороший пример.
41 Shurjk
 
27.01.10
13:21
(40) Там написано что вторая таблица соединяется с третьей, а не с результатом соединения первой и второй...
42 Kaidend
 
27.01.10
13:22
(41) Там - это где? В (0) или в тексте запроса?
43 Shurjk
 
27.01.10
13:23
(42) И там и там
44 Kaidend
 
27.01.10
13:26
(43) А потом результат соединения второй и третьей таблицы соединяется с первой?
45 Shurjk
 
27.01.10
13:27
(44) С какой радости?
46 Shurjk
 
27.01.10
13:28
(44) С первой соединяется вторая таблица
47 Kaidend
 
27.01.10
13:28
(45) А что тогда происходит после того, как вторая и третья таблица соединились?
48 Ненавижу 1С
 
гуру
27.01.10
13:30
Давайте сначала переложим на язык алгебры понятия LEFT и INNER JOIN
49 ЗлобнийМальчик
 
27.01.10
13:31
я предлагаю продвинуть данную тему минимум до 100 постов!!!!!
50 Shurjk
 
27.01.10
13:31
(47) Происходит результат запроса причем не последовательно а сразу
51 EasyRider
 
27.01.10
13:38
(50)ТОгда в полеСтрока1 должен лежать результат соединения 2й и 3й таблицы?
52 Kaidend
 
27.01.10
13:43
(50) Бред, мне кажется. С тем же успехом можно взять пример 5 + 3 - 2 и рассуждать о том, что из тройки сначала вычитается 2, потом к ней же добавляется пятерка. Пятерка добавляется уже к результу вычитания двойки из тройки.

К тому же ваша логика будет пробуксовывать на более сложных примерах типа
А <LEFT JOIN> Б <INNER JOIN> В <RIGHT JOIN> Г.
Там "сразу" уже никак не получится.
53 Ненавижу 1С
 
гуру
27.01.10
13:43
(31)(32) так делать просто нельзя, это неверный вывод, в результате получаем не просто множества, а их проихведения
54 hhhh
 
27.01.10
13:51
(52) пример

А <LEFT JOIN> Б <INNER JOIN> В <RIGHT JOIN> Г.

бредовый, поэтому на нем будет пробуксовывать любая логика.
55 Shurjk
 
27.01.10
13:51
(52) Когда кажется креститься надо....
Чем будет вызвана пробуксовка?
56 Sadovnikov
 
27.01.10
13:52
Народ, вы чего курите? Отсыпьте, а?
57 Shurjk
 
27.01.10
14:12
(56) Взял всех распугал....
58 Sadovnikov
 
27.01.10
14:19
(57) :))
59 fisher
 
27.01.10
14:22
(0) Если речь об клиент-серверной версии, то приоритеты определяет SQL-сервер, а не 1С. Некоторые связки уже фиксированы изначально, в зависимости от того, по каким полям каких таблиц задано соединение и какие типы соединений указаны. Если Б вяжется с С (по полям из Б и С), то А с С напрямую не свяжешь. В рамках оставшихся степеней свободы фантазирует оптимизатор запросов SQL. Т.е. какой именно в итоге порядок будет - заранее сказать затруднительно. Оптимизатор запросов при определении плана выполнения запроса учитывает множество факторов.
60 Shurjk
 
27.01.10
14:25
(59) В еще одно мнение, предлагаю голосовалку завести варианты:
1. Свяжет по очереди как в арифметике.
2. Свяжет так как в запросе написано.
3. Свяжет непонятно как - зависит от настроек SQL  скорости ветра и магнитной активности солнца.
61 Ненавижу 1С
 
гуру
27.01.10
14:26
Ребята, но ведь в общем случае это не корректно
62 Sadovnikov
 
27.01.10
14:27
(60) Про зависимоть расмножения мух дроздофил в условиях крайнего севера от трансигуляции полярного сияния забыл. :)
63 Shurjk
 
27.01.10
14:27
(61) Что именно? язык запросов? или то как он работает, с чем вы несогласны?
64 Shurjk
 
27.01.10
14:28
(62) Сначало надо общий пример разобрать потом уже частности....
65 Sadovnikov
 
27.01.10
14:29
(63)
- С кем именно Вы не согласны?
- Да с обоими! Пишут, понимешь, пишут! Взять и всё поделить!
66 los_hooliganos
 
27.01.10
16:04
Совсем народ йопнулся.

Какая разница 5*6*22:
(5*6)*22 или 5*(6*22)??!
67 Shurjk
 
27.01.10
16:06
(66) Заметь народ с многолетним стажем....
68 los_hooliganos
 
27.01.10
16:06
А по реляционной алгербре:

Table1 cross join table2 cross join table3
where (тут условие соединений)