![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужно подробное описание работы объединения JOIN [D5, D6, IB6.x, Firebird 1.5]
Sirus © (2004-12-02 08:16:00)Привет Мастера...
Нужна документация по работе объединения JOIN в Interbase/Firebird... Желательно подробная...
Zacho (2004-12-08 12:05:00) [1]Sirus (08.12.04 11:31) [42]
Советую почитать "SQL" М.Грабера.
Sirus (2004-12-08 11:31:00) [2]Вобщем спасибо всем... На всякий случай сохраню этот обсуждение полностью.
А в документации SQL reference Help на SELECT нет почти никакого описания JOIN. Там просто указано как правильно писать слово JOIN и какие они бывают. Но не указано что они делают (по отдельности не указано)
Johnmen (2004-12-08 11:10:00) [3]Существует 2 вида соединения, внутреннее и внешнее.
При этом внешнее м.б. только одного вида (LEFT, RIGHT или FULL).
См. документацию SQL Reference Help на SELECT.
ЮЮ (2004-12-08 11:01:00) [4]1. "объеденяет" только те записи, которые есть в обеих таблицах (по условию связи)
2. Yes
3. пишешь LEFT JOIN, просто помня, что это OUTER JOIN
4. пишешь JOIN, просто помня, что это INNER JOIN
Sirus (2004-12-08 08:04:00) [5]Нет... Пока вешаться не стану...
Из всего что я прочел, я понял, что в IB:
1. INNER не бывает LEFT и RIGHT
2. LEFT и RIGHT бывает только OUTER (FULL пока мне не нужен)
3. LEFT JOIN собирает все записи из левой таблицы и все что к ним есть из правой, если нету то NULL
4. RIGHT JOIN делает то же самое, только в правую сторону..
Выводы:
1. Я не понял как работает INNER JOIN (извините, честно не понял :)
2.
table1 left join table2 on ...
left join table3 on ...
выбирает все записи из первой таблицы и все что к ним есть из второй и третьей таблицы, если нету то NULL
3. Если я пишу LEFT JOIN, то я пишу OUTER LEFT JOIN
4. Если я пишу JOIN, то я пишу INNER JOIN
ТАК???
З.Ы. Если что не так, ногами не пинайте, руками не бейте, просто объясните что к чему... :)))
Anatoly Podgoretsky (2004-12-02 15:33:00) [6]Ага или пойдет вешаться
ЮЮ (2004-12-02 12:30:00) [7]Почитав весь пост, автор вопроса, надеюсь, окончательно поймет все тонкосьи JOIN :)
Johnmen (2004-12-02 12:23:00) [8]>Sergey_Masloff (02.12.04 11:59) [27]
Не расстраивайся, со всеми бывает...
:)
>Sergey_Masloff (02.12.04 12:06) [30]
Да и в стандарте <...>=<...> эквивалентно INNER.
Sergey_Masloff (2004-12-02 12:22:00) [9]ЮЮ © (02.12.04 12:13) [34]
>Даже над "INNER бывает LEFT и RIGHT" не могу :(
Это описка конечно... и температура. Я раз 5 прочитал твой пост пока понял о чем речь и при чем смех тут...
Давай еще раз я приведу наш диалог как я его на данный момент понимаю:
ЮЮ: В оракле что по умолчанию OUTER?
Я: Нет INNER но в IB OUTER! (тут я ошибался но не важно)
ЮЮ: так что INNER бывает LEFT и RIGHT ?
Я: (не поняв откуда вывод) советую читать мои посты (еще не понимая что [22] из-за описки является полной чушью)
Так вроде?
ЮЮ (2004-12-02 12:13:00) [10]>Прочитай еще раз [18] ;-)
Прочитал. Там жирно выделено OUTER, а в [22] уточнено, что LEFT.
Где смеяться не знаю :( Даже над "INNER бывает LEFT и RIGHT" не могу :(
Sergey_Masloff (2004-12-02 12:09:00) [11]Блин я сижу с температурой, сервер глючит, просто жизнь дала трещину! ;-)
Sergey_Masloff (2004-12-02 12:08:00) [12]ЮЮ © (02.12.04 12:05) [29]
Прочитай еще раз [18] ;-)
Sergey_Masloff (2004-12-02 12:08:00) [13]ЮЮ © (02.12.04 12:05) [29]
Прочитай еще раз [18] ;-)
Sergey_Masloff (2004-12-02 12:06:00) [14]ЮЮ © (02.12.04 12:03) [28]
Не противоречит. В ORACLE - INNER
В IB (я БЫЛ уверен - OUTER). На самом деле тоже INNER
ЮЮ (2004-12-02 12:05:00) [15]>Ты мои посты читаешь или чьи-то еще? ;-))
[18], [22]
ЮЮ (2004-12-02 12:03:00) [16]>DenK_vrtz © (02.12.04 11:56) [26]
противоречишь Sergey_Masloff (02.12.04 11:16) [18], [22], т.к. даже в оракле не могут быть равнозначны INNER JOIN и LEFT OUTER JOIN :)
Sergey_Masloff (2004-12-02 11:59:00) [17]ЮЮ © (02.12.04 11:37) [23]
>Ну уж если в ORACLE
Ты мои посты читаешь или чьи-то еще? ;-))
Johnmen © (02.12.04 11:25) [20]
>Выполниться одинаково. Неявное внутреннее (INNER) соединение.
Вот специально сейчас проверил. Ты прав (в IB тоже самое, про ORACLE я не сомневался). Вобщем, полная потеря лица иду ламерить дома ;-)
Уверен на 100% был что не так (что OUTER неявный)
DenK_vrtz (2004-12-02 11:56:00) [18]>ЮЮ © (02.12.04 11:37) [23]
select a.xx, b.yy
from atable a, btable b
where a.simefield = b.somefield
в ORACLE можно еще (начиная с 9i) записать как
SELECT a.xx, b.yy
from atable a INNER JOIN btable b
on a.simefield = b.somefield
или
SELECT a.xx, b.yy
from atable a INNER JOIN btable b
USING (somefield)
Johnmen (2004-12-02 11:55:00) [19]>Sergey_Masloff (02.12.04 11:30) [22]
Что-то ты мудришь. Авторитетов помянул...:)
Достаточно глянуть в стандарт SQL92.
Появился новый класс табличных выражений, называемых "табличными выражениями
с соединениями " (join-table-expression), которые можно использовать только
в разделе FROM. Такие табличные выражения строятся на основе базовых и/или
представляемых таблиц на основе использования разных видов операции соединения:
CROSS JOIN (Декартово произведение), INNER (обычное соединение), LEFT и
LEFT OUTER (левое и левое внешнее соединение), RIGHT и RIGHT OUTER (правое и
правое внешнее соединение), FULL и FULL JOIN (полное и полное внешнее
соединение) и UNION (объединение).
ЮЮ (2004-12-02 11:43:00) [20]>Sergey_Masloff (02.12.04 11:30) [22]
Тебе известны
закрытый
открытый (левый, правый, полный)
Мне известны
INNER JOIN
LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN
Следует ли, что
закрытый = INNER
открытый = OUTER ?
как же тогда
INNER бывает LEFT и RIGHT ?