powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Общий вопрос по работе JOIN
21 сообщений из 21, страница 1 из 1
Общий вопрос по работе JOIN
    #36602645
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для начала: результат JOIN это вьюха?
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36602647
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что Вы подразумеваете под термином "вьюха"?
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36602668
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Результат работы JOIN.
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36602675
донМахитоРезультат работы JOIN.У join нет результата так как он сам по себе ничего не значит. Результат есть у запроса. Который может быть с Join'ом. Но смысл и тип результат от этого не меняется. В любом случае это набор записей.
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36602691
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
донМахито,

Нет. Результат join'а это множество данных удовлетворяющее условиям соединения джоина. А View это предопределенный запрос, который может содержать соединения(join) с другими таблицами, который сохраняется SQL сервером постоянно с момента создания в оптимизированном состоянии.
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36602763
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда я не корректно понимаю JOIN, когда к одной таблице цепляются сразу несколько таблиц. Например:
Autosaloon (id)---(pid)Garage(id)--(pid)Marka
|
(pid)Device

Прежде, чем присоединить Garage к Autosaloon, нужно присоединить Device к Garage. Тогда Autosaloon будет соединен с результирующим значением (набором записей) Garage и Device, которое будет называться Garage. Затем соединяем Marka с Garage.
Результат соединения Device и Garage -- нечто вроде вьюхи с названием Garage.
Код: plaintext
1.
2.
3.
4.
5.
FROM Autosaloon
   LEFT JOIN Garage
           LEFT JOIN Device ON Garage.id=Device.pid
   ON Autosaloon.id=Garage.pid
   LEFT JOIN Marka ON Garage.id=Marka.pid
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36602769
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
Autosaloon (id)---(pid)Garage(id)--(pid)Marka
                                          |
                                        (pid)Device
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36602809
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Куда выводить результат SELECTа зависит от того что ты в INTO укажешь. Тут почитай

PS. JOIN тут никакой роли не играет.
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36602847
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно, а сама логика верная?
автор
Прежде, чем присоединить Garage к Autosaloon, нужно присоединить Device к Garage. Тогда Autosaloon будет соединен с результирующим значением (набором записей) Garage и Device, которое будет называться Garage . Затем соединяем Marka с Garage .

Просто далее есть задача к Garage еще несколько "веток" присоединить. Хотел бы сначала узнать, правильно ли мыслю.
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36602930
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В такой ситуации:
Код: plaintext
1.
2.
3.
4.
Autosaloon (id)---(pid)Garage(id)--(pid)Marka
                                         ||
                                         |(pid)Device 
                                         |
                                       (pid)Service
получается, что:
1. соединяем Autosaloon с результатом соединения Garage, Device и Service.
2. Сначала соединяем Garage с Device, затем полученный результат с Service. Либо cначала Garage с Service, а затем полученный результат с Device.
3. Соединяем полученный результат с Marka.
Так?

з.ы. реальной задачи пока нет, так что разбор на пальцах.
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36602933
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Device и Service опять сместились под марку. Они цепляются к Garage
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36602958
донМахито,
Вы там что, в дизайнере запросов что ли колдуете?
Цепочка связанных джойном таблиц НЕ зависит от порядка их перечисления. Она зависит от условий после слова ON.
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36603009
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36605097
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,
нужного не нашел.
Вопрос темы: я не понимаю, как строится JOIN, когда к одной таблице есть несколько привязок.
Autosaloon (id)---(pid)Garage(id)--(pid)Marka
к Garage цепляются еще 2 цепочки: (pid)Device и (pid)Service

Код: plaintext
1.
2.
3.
4.
5.
FROM Autosaloon
    LEFT JOIN Garage
                  LEFT JOIN Device ON Device.pid=Garage.id
    ON Garage.pid=Autosaloon.id
........
Дальше не понимаю. Вроде с автосалоном связывается не сам гараж, а гараж + Device и Service (поэтому сначала к гаражу делаем left join Device on Device.pid=Garage.id), а как прицепить Service?
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36605184
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: донМахито
> Вопрос темы: я не понимаю, как строится JOIN, когда к одной таблице есть несколько привязок.
> Autosaloon (id)---(pid)Garage(id)--(pid)Marka
> к Garage цепляются еще 2 цепочки: (pid)Device и (pid)Service
Код: plaintext
1.
2.
3.
4.
 FROM Autosaloon
    LEFT JOIN Garage
                  LEFT JOIN Device ON Device.pid=Garage.id

    ON Garage.pid=Autosaloon.id

Идет просмотр на предмет поиска первого предложения ON (ON Device.pid=Garage.id) для этого ON определяется тип
соединения(в данном случае LEFT), дальше делается левое соединение этих таблиц. результат как-бы становится
вместо таблицы Garage. Снова ищется предикат ON (ON Garage.pid=Autosaloon.id) и для него определяется тип соединения(
тоже LEFT ). После чего производится соединение Autosaloon и результата предыдущего соединения и в данном примере это и
будет конечный результат. А в общем случае, этот результат "запоминается" и снова ищется предикат ON, определяется тип
соединения и производится соединение. И так пока не закончатся все предикаты ON.

> Дальше не понимаю. Вроде с автосалоном связывается не сам гараж, а гараж + Device и Service (поэтому сначала к гаражу
> делаем left join Device on Device.pid=Garage.id), а как прицепить Service?

Ну так и цепляй их там:
Код: plaintext
1.
2.
3.
4.
 FROM Autosaloon
    LEFT JOIN Garage
                  LEFT JOIN Device ON Device.pid=Garage.id
                  LEFT JOIN Service ON Service.pid=Garage.id
    ON Garage.pid=Autosaloon.id
Т.е. сначала должен построится список гаражей, со всеми девайсами и услугами, после этого ко всем автосалонам будет
прилефтджоинен этот список

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36605299
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос
Ну так и цепляй их там:
Код: plaintext
1.
2.
3.
4.
 FROM Autosaloon
    LEFT JOIN Garage
                  LEFT JOIN Device ON Device.pid=Garage.id
                  LEFT JOIN Service ON Service.pid=Garage.id
    ON Garage.pid=Autosaloon.id
Т.е. сначала должен построится список гаражей, со всеми девайсами и услугами, после этого ко всем автосалонам будет
прилефтджоинен этот список

Аааа, теперь понял, что имел ввиду проходящий, когда сказал по поводу ON. Я то думал, такая конструкция -- это типа "параллельное" подцепление. А сначала Device цепляется к Garage и только затем Service цепляется к Garage, точнее уже к результату Garage + Device.7
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36605324
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
донМахитоВладимирМ,
нужного не нашел.
Вопрос темы: я не понимаю, как строится JOIN, когда к одной таблице есть несколько привязок.

Вам уже сказали, что для Select нет такого понятия как "привязка". Ну, совсем утрируя:

Сканируются ВСЕ записи во ВСЕХ таблицах. Паралельно (или одновременно, как понятнее) Дальше проверяются условия объединения ON и WHERE для КАЖДОЙ записи. LEFT - это уже "довесок" к результату подобного сравнения. Или, лучше сказать, уточнение, условий объединения

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

Если Вы поменяете местами строки с LEFT по разным таблицам - результат никак не изменится. Результат изменится, если Вы поменяете условия объединения в ON или WHERE.

Я же не случайно сравнил процесс выборки с вложенными циклами, сканирующими ВСЕ записи во ВСЕХ таблицах. Так какая разница, по какой таблице пойдет внешний цикл, а по какой - внутренний, если в результате все равно будут просканированы вообще ВСЕ записи во ВСЕХ таблицах.
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36605343
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, то, что описал Игорь, как образ для лучшего понимания процесса - тоже справедливо. Так проще себе представить происходящее: сцепили первую таблицу со второй, потом к результату сцепки добавили третью, и т.п.
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36605422
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМВсе таблицы "сцепляются" одновременно .

Получается все эти хитроотступные извороты не нужны? Можно просто делать left join on за left join on и все?
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36605458
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: донМахито
> Получается все эти хитроотступные извороты не нужны?

Хитроотступные извороты нужны тебе самому и тому товарищу, который придет сопровождать этот код. Для лучшего понимания

> Можно просто делать left join on за left join on и все?

Нет! при левых/правых соединениях нужно обращать внимание на порядок указания таблиц.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Create Cursor Autosalon( ;
 id Int, ; && Первичный ключ
 name v( 50 ) ; && название автосалона
 )

Create Cursor Garage( ;
 id Int, ; && Первичный ключ
 pid_autosalon int, ; && Ссылка на автосалон, которому принадлежит гараж
 name v( 50 ) ; && название устройства
 )



INSERT INTO Autosalon(id, name) values( 1 , 'name1')
INSERT INTO Autosalon(id, name) values( 3 , 'name3')

INSERT INTO Garage(id, pid_autosalon, name) values( 4 ,  1 , 'name4')
INSERT INTO Garage(id, pid_autosalon, name) values( 5 ,  2 , 'name5')

select a.*, g.* FROM Autosalon a LEFT JOIN Garage g ;
ON a.id = g.pid_autosalon INTO CURSOR left_a
BROWSE

select a.*, g.* FROM Garage g LEFT JOIN Autosalon a ;
ON a.id = g.pid_autosalon INTO CURSOR left_g
BROWSE
Сравни результат

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Общий вопрос по работе JOIN
    #36605537
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос
Хитроотступные извороты нужны тебе самому и тому товарищу, который придет сопровождать этот код. Для лучшего понимания

понятно
Игорь Горбонос
Нет! при левых/правых соединениях нужно обращать внимание на порядок указания таблиц.
[
Спасибо за пример.
Как раз из-за порядка и волнуюсь. Всегда начинаю с "главной" для селекта таблицы, как здесь. С ней соединяю все остальные. Или в джоинах это единственный "порядок": главная таблица всегда первая, т.е. соединения начинаются с нее, а уже дальнейший порядок соединений не имеет значение?

з.ы. нашел пример, 9 таблиц. пишу селект.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Общий вопрос по работе JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]