![]() |
![]() |
![]() |
|
Есть ли в 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 (тут условие соединений) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |