Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
донМахито
Guest
Ecть некоторое количество связанных таблиц, связь -- друг за другом, получается как цепочка. Связал их через LEFT JOIN от самой первой (по ней же и отбор по ключу) до последней. Теперь нужно добавить еще одну таблицу, она связана с одной из таблиц в цепочке (с третьей по порядку).
Структура:
Табл1--Табл2--Табл3--Табл4--Табл5--Табл6--Табл7
|
Таблx

Возможно ли применить LEFT JOIN к такой структуре?
На всякий случай псевдокод селект по всей цепочке (без Таблх):
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
24 фев 10, 11:27    [8384424]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
донМахито
Guest
Форматирование сбилось -- Таблх привязана к Табл3.
В последнем джоинте забыл 7 поставить.
24 фев 10, 11:29    [8384442]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
А что, какие-то проблемы возникли? Какие?

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

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

http://forum.foxclub.ru/read.php?29,216597,216908#msg-216908
24 фев 10, 16:07    [8386785]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
донМахито
Guest
ВладимирМ,
Смысл LEFT JOIN понимаю: из левой таблицы выбрать даже те записи, которым нет соответствия по ключам в правой. Просто все примеры, которые видел были написаны "паровозиком": таблица цеплялась за таблицу и так цепочкой. А в моем случае к одному из звеньев добавляются еще таблицы -- типа побочное ответвление. Таких примеров LEFT JOIN я не видел, вот и интересуюсь, возможно ли такое.
25 мар 10, 11:29    [8530617]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
Игорь Горбонос
Member

Откуда: Днепропетровск
Сообщений: 4236

> Автор: донМахито
> А в моем случае к одному из звеньев добавляются еще таблицы -- типа побочное ответвление. Таких примеров LEFT
> JOIN я не видел, вот и интересуюсь, возможно ли такое.

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

Posted via ActualForum NNTP Server 1.4

25 мар 10, 12:42    [8531196]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
донМахито
Смысл LEFT JOIN понимаю: из левой таблицы выбрать даже те записи, которым нет соответствия по ключам в правой. Просто все примеры, которые видел были написаны "паровозиком": таблица цеплялась за таблицу и так цепочкой. А в моем случае к одному из звеньев добавляются еще таблицы -- типа побочное ответвление. Таких примеров LEFT JOIN я не видел, вот и интересуюсь, возможно ли такое.

И что, за месяц, прошедший со дня создания темы не смог создать тестовый примерчик и попробовать?
25 мар 10, 14:33    [8532205]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
донМахито
Guest
Игорь Горбонос,
зато у меня пример есть. Там правда побочкой только одна таблица цепляется. Как в запросе выглядеть будет?
Чтобы не засорять -- псевдокод:
Таблица1 LEFT JOIN Таблица2
Таблица2 LEFT JOIN Таблица3
Таблица3 LEFT JOIN ТаблицаX<-- подключаем побочку
Таблица3 LEFT JOIN Таблица4<-- возвращаемся к главной цепочке
Таблица4 LEFT JOIN Таблица5
Так делается?

ВладимирМ,
Переключился на другую работу. Сейчас появилось свободное время -- вернулся к вопросу. Сейчас попробую -- не люблю тратить время, если не уверен, что правильно.
25 мар 10, 14:49    [8532368]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
Игорь Горбонос
Member

Откуда: Днепропетровск
Сообщений: 4236
> Автор: донМахито
> Игорь Горбонос,
> зато у меня пример есть. Там правда побочкой только одна таблица цепляется. Как в запросе выглядеть будет?
> Чтобы не засорять -- псевдокод:

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

Пример:
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
Как-то так
25 мар 10, 15:33    [8532871]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
донМахито
Guest
Игорь Горбонос,
соединение по ключам pk--fk. Проверил. Запрос вроде выводит инфу, но там много инфы дополнительно , сейчас вспоминаю что к чему, чтобы проверить:) А то что-то результат подозрительный.
25 мар 10, 16:22    [8533329]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
Игорь Горбонос
Member

Откуда: Днепропетровск
Сообщений: 4236

> Автор: донМахито
> А то что-то результат подозрительный.

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


Posted via ActualForum NNTP Server 1.4

25 мар 10, 16:30    [8533417]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
донМахито
Guest
Непонятка: выводит инфу, которой не должно быть, при этом из "побочной" таблицы выводит .NULL., когда там все, что нужно заполнено.
Цепочка: vidocbase--> unit_ref--> uMenuRBS--> uMenuRSP--> uMenuRFD--> uFood--> nobase
К uMenuRBS цепляется еще одна таблица: uOtdel. Вот кусок с джоинами:
	
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
Я правильно связал?
25 мар 10, 16:33    [8533456]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
Игорь Горбонос
Member

Откуда: Днепропетровск
Сообщений: 4236

> Автор: донМахито

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

Я бы написал так:
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

25 мар 10, 17:10    [8533821]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
донМахито
Guest
Игорь Горбонос,
более опытный в sql товарищ посоветовал через него работать. А в фоксе оказывается скобками отделять надо. Теперь все корректно выводит.
Спасибо за помощь.
25 мар 10, 17:48    [8534165]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
Игорь Горбонос
Member

Откуда: Днепропетровск
Сообщений: 4236

> Автор: донМахито
> более опытный в sql товарищ посоветовал через него работать.

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

Как пример таблица с названиями отделов и таблица с отрудников
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

25 мар 10, 18:05    [8534274]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
донМахито
Guest
Игорь Горбонос,
стараюсь начинать цепочку с той таблицы, которая участвует в условии. По идее так никаких неожиданностей не будет: в самой первой левой таблице получаем только те записи, которые отобрали в условии.

Теперь другой вариант:
таблица vidocbase в середине цепочки, т.е. и слева, и справа есть связанные с ней таблицы. Так взял, потому что как раз по ней идет условие.
vidocbase (rn)---(master_rn)idocspec(rn_numcl)---(rn)nobase
|(rn)
|
|(child_rn)
unit_ref
|(parent_rn)
|
|(rn)
uMenuRBS
Можно ли сделать JOIN?
FROM vidocbase
       LEFT JOIN ...
13 апр 10, 17:17    [8623220]     Ответить | Цитировать Сообщить модератору
 Re: Как работает JOIN: таблицы цепляются друг за другом или не обязательно?  [new]
Игорь Горбонос
Member

Откуда: Днепропетровск
Сообщений: 4236

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

Posted via ActualForum NNTP Server 1.4

19 апр 10, 10:17    [8648496]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить