powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
16 сообщений из 16, страница 1 из 1
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36485389
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ecть некоторое количество связанных таблиц, связь -- друг за другом, получается как цепочка. Связал их через LEFT JOIN от самой первой (по ней же и отбор по ключу) до последней. Теперь нужно добавить еще одну таблицу, она связана с одной из таблиц в цепочке (с третьей по порядку).
Структура:
Табл1--Табл2--Табл3--Табл4--Табл5--Табл6--Табл7
|
Таблx

Возможно ли применить LEFT JOIN к такой структуре?
На всякий случай псевдокод селект по всей цепочке (без Таблх):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT Табл1.num_doc,Табл2.name, Табл3.seas,Табл4.scope, Табл5.value,Табл6.out,Табл7.name_nom
FROM Табл1
     LEFT JOIN Табл2 ON Табл1.id=Табл2.sec_id
     LEFT JOIN Табл3 ON Табл2.parent_id=Табл3.id
     LEFT JOIN Табл4 ON Табл3.id=Табл4.sec_id
     LEFT JOIN Табл5 ON Табл4.id=Табл5.sec_id
     LEFT JOIN Табл6 ON Табл5.sec_id=Табл6.id
     LEFT JOIN Табл7 ON Табл6.id=Табл.sec_id 
WHERE Табл1.id=” 2642
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36485395
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Форматирование сбилось -- Таблх привязана к Табл3.
В последнем джоинте забыл 7 поставить.
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36486141
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, какие-то проблемы возникли? Какие?

Вы не правильно понимаете смысл внешних объединений (LEFT, RIGHT, FULL). Эта штука работает как INNER JOIN, но кроме этого добавляет в выборку те записи, которым не нашлось соответствие в "присоединяемых" таблицах.

И вообще, объединение таблиц не есть формальное "сложение". Это некая операция сопоставления

http://forum.foxclub.ru/read.php?29,216597,216908#msg-216908
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36541670
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,
Смысл LEFT JOIN понимаю: из левой таблицы выбрать даже те записи, которым нет соответствия по ключам в правой. Просто все примеры, которые видел были написаны "паровозиком": таблица цеплялась за таблицу и так цепочкой. А в моем случае к одному из звеньев добавляются еще таблицы -- типа побочное ответвление. Таких примеров LEFT JOIN я не видел, вот и интересуюсь, возможно ли такое.
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36541932
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: донМахито
> А в моем случае к одному из звеньев добавляются еще таблицы -- типа побочное ответвление. Таких примеров LEFT
> JOIN я не видел, вот и интересуюсь, возможно ли такое.

Почему нет, можно :) Только сходу не придумаю пример, хотя вроде как проскакивали такие запросы.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36542349
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
донМахитоСмысл LEFT JOIN понимаю: из левой таблицы выбрать даже те записи, которым нет соответствия по ключам в правой. Просто все примеры, которые видел были написаны "паровозиком": таблица цеплялась за таблицу и так цепочкой. А в моем случае к одному из звеньев добавляются еще таблицы -- типа побочное ответвление. Таких примеров LEFT JOIN я не видел, вот и интересуюсь, возможно ли такое.
И что, за месяц, прошедший со дня создания темы не смог создать тестовый примерчик и попробовать?
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36542414
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос,
зато у меня пример есть. Там правда побочкой только одна таблица цепляется. Как в запросе выглядеть будет?
Чтобы не засорять -- псевдокод:
Код: plaintext
1.
2.
3.
4.
Таблица1 LEFT JOIN Таблица2
Таблица2 LEFT JOIN Таблица3
Таблица3 LEFT JOIN ТаблицаX<-- подключаем побочку
Таблица3 LEFT JOIN Таблица4<-- возвращаемся к главной цепочке
Таблица4 LEFT JOIN Таблица5
Так делается?

ВладимирМ,
Переключился на другую работу. Сейчас появилось свободное время -- вернулся к вопросу. Сейчас попробую -- не люблю тратить время, если не уверен, что правильно.
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36542587
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: донМахито
> Игорь Горбонос,
> зато у меня пример есть. Там правда побочкой только одна таблица цепляется. Как в запросе выглядеть будет?
> Чтобы не засорять -- псевдокод:

Вот псевдокод это зря :) потому что в этом псевдокоде ты не указал самое главное: условия соединений!
Именно по ним будет определятся наличие цепочки, а не по порядку написания джоинов. По порядку написания джоинов будет определятся очерёдность просмотра таблиц при выборке данных.

Пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
From dostup_branch  Таблица разрешений пользователей
Inner Join branch филиалы
 On db.code_branch_end = branch.code 
Inner Join zakaz  Заказы
 On branch.code = zakaz.code_branch
     Началась ветка расшифровки содержимого заказов
      Inner Join invoice позиции заказа
         On zakaz.code = invoice.code_zakaz 
      Здесь закончилась ветка расшифровки содержимого заказов
Продолжение основной ветки
Left Outer Join packets Пакеты заказов для отправки
 On zakaz.code_packets = packets.code
Как-то так
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36542761
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос,
соединение по ключам pk--fk. Проверил. Запрос вроде выводит инфу, но там много инфы дополнительно , сейчас вспоминаю что к чему, чтобы проверить:) А то что-то результат подозрительный.
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36542787
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: донМахито
> А то что-то результат подозрительный.

Составь таблички на несколько строк и прогони запрос


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36542798
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непонятка: выводит инфу, которой не должно быть, при этом из "побочной" таблицы выводит .NULL., когда там все, что нужно заполнено.
Цепочка: vidocbase--> unit_ref--> uMenuRBS--> uMenuRSP--> uMenuRFD--> uFood--> nobase
К uMenuRBS цепляется еще одна таблица: uOtdel. Вот кусок с джоинами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	
FROM vidocbase ;
     	LEFT JOIN unit_ref ON vidocbase.rn=unit_ref.child_rn ;
     	LEFT JOIN uMenuRBS ON unit_ref.parent_rn=uMenuRBS.rn ;
     	LEFT JOIN uOtdel ON uMenuRBS.rn_otdel=uOtdel.rn;
     	LEFT JOIN uMenuRSP ON uMenuRBS.rn=uMenuRSP.master_rn ;
     	LEFT JOIN uMenuRFD ON uMenuRSP.rn=uMenuRFD.master_rn ;
     	LEFT JOIN uFood ON uMenuRFD.rn_food=uFood.rn_food 
        LEFT JOIN nobase ON uFood.rn_food=nobase.rn WHERE
Я правильно связал?
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36542912
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: донМахито

А почему uOtdel цепляется через лефт джоин? И вообще, почему все таблицы через лефт джоин?

Я бы написал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT *
FROM   vidocbase
       LEFT JOIN unit_ref
       ON     vidocbase.rn=unit_ref.child_rn
       LEFT JOIN uMenuRBS
            LEFT JOIN uOtdel Сначала получаем пересечение таблиц uMenuRBS и uOtdel
            ON     uMenuRBS.rn_otdel=uOtdel.rn
       ON     unit_ref.parent_rn=uMenuRBS.rn а потом получившееся пересечение цепляем к основному
       LEFT JOIN uMenuRSP
       ON     uMenuRBS.rn=uMenuRSP.master_rn
       LEFT JOIN uMenuRFD
       ON     uMenuRSP.rn=uMenuRFD.master_rn
       LEFT JOIN uFood
       ON     uMenuRFD.rn_food=uFood.rn_food
       LEFT JOIN nobase
       ON     uFood.rn_food=nobase.rn
З.Ы. Почитай в справке как оформлять такие джоины на фокспро, потому что это я привел пример для MSSQL. Для фокспро
такое тоже писал, но сейчас не могу найти точный синтаксис

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36543010
донМахито
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос,
более опытный в sql товарищ посоветовал через него работать. А в фоксе оказывается скобками отделять надо. Теперь все корректно выводит.
Спасибо за помощь.
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36543046
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: донМахито
> более опытный в sql товарищ посоветовал через него работать.

Лефт джоин применяется когда нужно получить все записи из левой таблицы и дополнить совпадающими записями из правой
таблицы, т.е. когда в правой таблице может не быть совпадающих записей. Если ты уверен что в правой таблице всегда будут
нужные данные, тогда лучше переписать на иннер.

Как пример таблица с названиями отделов и таблица с отрудников
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE CURSOR uOtdel(id_otded int, captions v( 50 ))

CREATE CURSOR uWokers(id_woker int, ref_otdel int, fio v( 50 ))

INSERT INTO uOtdel(id_otded, captions) values( 1 , 'Продажи')

INSERT INTO uOtdel(id_otded, captions) values( 2 , 'Закупка')

INSERT INTO uOtdel(id_otded, captions) values( 3 , 'Бухгалтерия')

INSERT INTO uWokers(id_woker, ref_otdel, fio) values( 1 ,  1 , 'Иванов')

INSERT INTO uWokers(id_woker, ref_otdel, fio) values( 2 ,  1 , 'Петров')

INSERT INTO uWokers(id_woker, ref_otdel, fio) values( 3 ,  3 , 'Сидорова')

SELECT * FROM uOtdel INNER JOIN uWokers ON uOtdel.id_otded = uWokers.ref_otdel

browse

В результате будут все работники и только два отдела, хотя если INNER JOIN заменить на LEFT OUTER JOIN то в результате
будут все отделы, а на недостающем сотруднике будут нулы

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

Теперь другой вариант:
таблица vidocbase в середине цепочки, т.е. и слева, и справа есть связанные с ней таблицы. Так взял, потому что как раз по ней идет условие.
vidocbase (rn)---(master_rn)idocspec(rn_numcl)---(rn)nobase
|(rn)
|
|(child_rn)
unit_ref
|(parent_rn)
|
|(rn)
uMenuRBS
Можно ли сделать JOIN?
Код: plaintext
1.
2.
FROM vidocbase
       LEFT JOIN ...
...
Рейтинг: 0 / 0
Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
    #36584980
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: донМахито
не понял схему данных, сделай так напиши запрос, какой есть сейчас и допиши какую таблицу нужно приджоинить к какой и по
каким полям связать.
Вообще-то можно, но нужно смотреть где располагать левое соединение

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как работает JOIN: таблицы цепляются друг за другом или не обязательно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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