Форум: "Базы";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
ВнизНужно подробное описание работы объединения JOIN Найти похожие ветки
← →
Sirus (2004-12-02 08:16) [0]Привет Мастера...
Нужна документация по работе объединения JOIN в Interbase/Firebird... Желательно подробная...
← →
Sergey_Masloff (2004-12-02 08:19) [1]А подробной документации по работе оператора поюс (+) в калькуляторе не нужно?
Если про работу с JOIN то читать langref.pdf из документации по IB
Если по реализации - так исходники открыты скачивай да читай.
← →
Sirus (2004-12-02 08:42) [2]Везде описана работа JOIN лишь поверхностно...
Мне нужно просто знать...
1. Разницу между INNER и OUTER
2. Разницу между LEFT и RIGHT
3. Что такое FULL
4. Как организовать выборку из таблицы и процедуры
пример:
select t1.field1, p1 field2 from table1 t1, procedire1(t1.field)
что-то наподобие этого, только так это не будет работать.
5. Как сделать выборку из трех таблиц, чтобы выборка делалась из первой таблицы, а потом уже дополнялась данными из двух таблиц (неважно есть они в двух таблицах или нет. table1 left join table2 on t1.field2=t1.field1 что-то наподобие этого только с тремя или более таблицами)
← →
Sirus (2004-12-02 08:46) [3]Вопросов еще много, но они длинные и у меня нет желания расписывать задачи и вопросы с желаемыми результатами, поэтому прошу просто ссылку на документацию. Желательно на русском языке.
А исходники я читать не стану. т.к. они явно не на Паскале и Бейсике. А Си я не знаю, так что не пойму, и если пойму то поздно будет...
← →
ЮЮ © (2004-12-02 09:04) [4]1. Всегда хватало OUTER - ао умолчанию для JOIN
2. Разницу между LEFT и RIGHT
table1 t1 left join table2 t2 on t1.field2=t1.field1
к записям в table1 присоединяются записи из table2, если таких нет, то t2.* будут NULL
table1 t1 right join table2 t2 on t1.field2=t1.field1
=
table2 t2 left join table1 t1 on t1.field2=t1.field1
т.е. к записям в table2 присоединяются записи из table1, если таких нет, то t1.* будут NULL
3. Что такое FULL
LEFT и RIGHT в одном флаконе, т.е. если соответствующих записей в t2, то t2.* будут NULL, а если нет в t1, то t1.* будут NULL
4. в IB не специализируюсь
5.
SELECT * FROM
table1 t1
left join table2 t2 on t1.field2=t1.field1
left join table3 t3 on t1.field3=t3.field1
left join table4 t4 on t3.field4=t3.field4
и т.д.
WHERE
(t1.field1 = :field1)
← →
Johnmen © (2004-12-02 09:53) [5]> объединения JOIN
Это соединение, а не объединение.
← →
Sergey_Masloff (2004-12-02 10:03) [6]ЮЮ © (02.12.04 09:04) [4]
>1. Всегда хватало OUTER - ао умолчанию для JOIN
По умолчанию где? ;-) Везде по разному. Впрочем в IB действительно OUTER
4 Если процедура это фактически подзапрос кореллирующий о основной выборкой то так:
select a.id, (select result from tour_get_product(a.ruleisn)) as result
from agreement a
← →
Johnmen © (2004-12-02 10:11) [7]>ЮЮ © (02.12.04 09:04) [4]
>1. Всегда хватало OUTER - ао умолчанию для JOIN
По умолчанию - INNER.
← →
ЮЮ © (2004-12-02 10:23) [8]>Johnmen © (02.12.04 10:11) [7]
>По умолчанию - INNER.
BOL -> auter joins
LEFT OUTER JOIN or LEFT JOIN
Local SQL Help
SELECT column_list
FROM table_reference
LEFT | RIGHT | FULL [OUTER] JOIN table_reference
ON predicate
[LEFT | RIGHT | FULL [OUTER] JOIN table_reference
ON predicate...]
← →
Anatoly Podgoretsky © (2004-12-02 10:40) [9]Если тебе нужно объединение, то тебе нужен UNION
← →
Sergey_Masloff (2004-12-02 10:50) [10]ЮЮ © (02.12.04 10:23) [8]
Johnmen © (02.12.04 10:11) [7]
Не спорьте. В MSSQL и LocalSQL по умолчанию OUTER
В ORACLE INNER
Вобщем, по разному
← →
Johnmen © (2004-12-02 10:57) [11]>Sergey_Masloff (02.12.04 10:50) [10]
А я и не спорю. Я утверждаю, что если для JOIN не указано никаких предикатов (по умолчанию), то это INNER JOIN.
Казалось бы, причем тут MSSQL, LocalSQL и ORACLE ?
:)))
← →
ЮЮ © (2004-12-02 11:01) [12]>Sergey_Masloff (02.12.04 10:50) [10]
А как я понял, LEFT, RIGHT и FULL - это и есть OUTER JOIN-ы
И есть просто [INNER] JOIN.
Разве возможны комбинации
T1 LEFT INNER JOIN T2 и T1 OUTER JOIN T2 ???
← →
Anatoly Podgoretsky © (2004-12-02 11:03) [13]Johnmen © (02.12.04 10:57) [11]
В соответствии со стандартом, об приверденности которому говорят все производители :-)
← →
Anatoly Podgoretsky © (2004-12-02 11:04) [14]Johnmen © (02.12.04 10:57) [11]
В соответствии со стандартом, об приверденности которому говорят все производители :-)
← →
Sergey_Masloff (2004-12-02 11:10) [15]Johnmen © (02.12.04 10:57) [11]
>А я и не спорю. Я утверждаю, что если для JOIN не указано никаких предикатов
select a.xx, b.yy
from atable a, btable b
where a.simefield = b.somefield
это тоже соединение, иначе JOIN. Он может быть закрытым и открытым. Inner и Outer, другими словами. В ORACLE и INTERBASE такой запрос выполнится по-разному. Как с твоим утверждением? ;-)
Вот что я имел в виду ;-)
← →
Sergey_Masloff (2004-12-02 11:12) [16]Ну то есть когда я говорю JOIN я имею в виду СОЕДИНЕНИЕ а не синтаксис записи который различается в явном и неявном JOIN-ах.
← →
ЮЮ © (2004-12-02 11:13) [17]>В ORACLE и INTERBASE такой запрос выполнится по-разному
Неужели в ORACLE это не эквивалентно
select a.xx, b.yy
from
atable a
[INNER] JOIN btable b ON a.simefield = b.somefield ????
← →
Sergey_Masloff (2004-12-02 11:16) [18]ЮЮ © (02.12.04 11:13) [17]
Эквивалентно
а в IB эквивалентно
select a.xx, b.yy
from
atable a
OUTER JOIN btable b ON a.simefield = b.somefield
и не только в IB ;-)
← →
ЮЮ © (2004-12-02 11:23) [19]Sergey_Masloff (02.12.04 11:16) [18]
И какой это OUTER? LEFT, RIGTH или FULL? :)
или в [12] я не прав?
← →
Johnmen © (2004-12-02 11:25) [20]>Sergey_Masloff (02.12.04 11:10) [15]
Выполниться одинаково. Неявное внутреннее (INNER) соединение.
А если (+), то это уже внешнее соединение (OUTER), левое (LEFT) или правое (RIGHT).
Хотя ты и сам эти элементарные основы знаешь...
Как с моим утверждением ?
Отвечаю:
1. Казалось бы, причем тут ORACLE ?
2. Anatoly Podgoretsky © (02.12.04 11:03) [13]
← →
Johnmen © (2004-12-02 11:26) [21]>Sergey_Masloff (02.12.04 11:16) [18]
>OUTER JOIN btable b ON a.simefield = b.somefield
Чего-то ты здесь не дописал, однако...:)
← →
Sergey_Masloff (2004-12-02 11:30) [22]ЮЮ © (02.12.04 11:23) [19]
>И какой это OUTER? LEFT, RIGTH или FULL? :)
LEFT
>или в [12] я не прав?
INNER бывает LEFT и RIGHT
FULL он сам по себе
бывает (ИМХО):
закрытый
открытый (левый и правый)
полный (как одновременно левый и правый)
ну еще бывает произведение таблиц
Дейт считает что полный это отдельный вид. Грабер относит FULL к открытым.
← →
ЮЮ © (2004-12-02 11:37) [23]Ну уж если в ORACLE
select a.xx, b.yy
from atable a, btable b
where a.simefield = b.somefield
эквивалентно
select a.xx, b.yy
from
atable a
LEFT JOIN btable b ON a.simefield = b.somefield
тогда понятно, почему спецы по ORACLE в таком почёте :)
← →
ЮЮ © (2004-12-02 11:43) [24]>Sergey_Masloff (02.12.04 11:30) [22]
Тебе известны
закрытый
открытый (левый, правый, полный)
Мне известны
INNER JOIN
LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN
Следует ли, что
закрытый = INNER
открытый = OUTER ?
как же тогда
INNER бывает LEFT и RIGHT ?
← →
Johnmen © (2004-12-02 11:55) [25]>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 (объединение).
← →
DenK_vrtz © (2004-12-02 11:56) [26]>ЮЮ © (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)
← →
Sergey_Masloff (2004-12-02 11:59) [27]ЮЮ © (02.12.04 11:37) [23]
>Ну уж если в ORACLE
Ты мои посты читаешь или чьи-то еще? ;-))
Johnmen © (02.12.04 11:25) [20]
>Выполниться одинаково. Неявное внутреннее (INNER) соединение.
Вот специально сейчас проверил. Ты прав (в IB тоже самое, про ORACLE я не сомневался). Вобщем, полная потеря лица иду ламерить дома ;-)
Уверен на 100% был что не так (что OUTER неявный)
← →
ЮЮ © (2004-12-02 12:03) [28]>DenK_vrtz © (02.12.04 11:56) [26]
противоречишь Sergey_Masloff (02.12.04 11:16) [18], [22], т.к. даже в оракле не могут быть равнозначны INNER JOIN и LEFT OUTER JOIN :)
← →
ЮЮ © (2004-12-02 12:05) [29]>Ты мои посты читаешь или чьи-то еще? ;-))
[18], [22]
← →
Sergey_Masloff (2004-12-02 12:06) [30]ЮЮ © (02.12.04 12:03) [28]
Не противоречит. В ORACLE - INNER
В IB (я БЫЛ уверен - OUTER). На самом деле тоже INNER
← →
Sergey_Masloff (2004-12-02 12:08) [31]ЮЮ © (02.12.04 12:05) [29]
Прочитай еще раз [18] ;-)
← →
Sergey_Masloff (2004-12-02 12:08) [32]ЮЮ © (02.12.04 12:05) [29]
Прочитай еще раз [18] ;-)
← →
Sergey_Masloff (2004-12-02 12:09) [33]Блин я сижу с температурой, сервер глючит, просто жизнь дала трещину! ;-)
← →
ЮЮ © (2004-12-02 12:13) [34]>Прочитай еще раз [18] ;-)
Прочитал. Там жирно выделено OUTER, а в [22] уточнено, что LEFT.
Где смеяться не знаю :( Даже над "INNER бывает LEFT и RIGHT" не могу :(
← →
Sergey_Masloff (2004-12-02 12:22) [35]ЮЮ © (02.12.04 12:13) [34]
>Даже над "INNER бывает LEFT и RIGHT" не могу :(
Это описка конечно... и температура. Я раз 5 прочитал твой пост пока понял о чем речь и при чем смех тут...
Давай еще раз я приведу наш диалог как я его на данный момент понимаю:
ЮЮ: В оракле что по умолчанию OUTER?
Я: Нет INNER но в IB OUTER! (тут я ошибался но не важно)
ЮЮ: так что INNER бывает LEFT и RIGHT ?
Я: (не поняв откуда вывод) советую читать мои посты (еще не понимая что [22] из-за описки является полной чушью)
Так вроде?
← →
Johnmen © (2004-12-02 12:23) [36]>Sergey_Masloff (02.12.04 11:59) [27]
Не расстраивайся, со всеми бывает...
:)
>Sergey_Masloff (02.12.04 12:06) [30]
Да и в стандарте <...>=<...> эквивалентно INNER.
← →
ЮЮ © (2004-12-02 12:30) [37]Почитав весь пост, автор вопроса, надеюсь, окончательно поймет все тонкосьи JOIN :)
← →
Anatoly Podgoretsky © (2004-12-02 15:33) [38]Ага или пойдет вешаться
← →
Sirus (2004-12-08 08:04) [39]Нет... Пока вешаться не стану...
Из всего что я прочел, я понял, что в 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
ТАК???
З.Ы. Если что не так, ногами не пинайте, руками не бейте, просто объясните что к чему... :)))
← →
ЮЮ © (2004-12-08 11:01) [40]1. "объеденяет" только те записи, которые есть в обеих таблицах (по условию связи)
2. Yes
3. пишешь LEFT JOIN, просто помня, что это OUTER JOIN
4. пишешь JOIN, просто помня, что это INNER JOIN
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.033 c