Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.09;
Скачать: CL | DM;

Вниз

Нужно подробное описание работы объединения 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.024 c
3-1102527664
Алихан
2004-12-08 20:41
2005.01.09
Поиск в базе данных


14-1103642476
Болтуны, кто они?
2004-12-21 18:21
2005.01.09
Предлагаю выбрать наиболее болтливых, по принципу:


14-1102939475
kai
2004-12-13 15:04
2005.01.09
как-то видел на этом форуме...


1-1103614782
Cosinus
2004-12-21 10:39
2005.01.09
Вопрос по TObject...


11-1084877331
mdw
2004-05-18 14:48
2005.01.09
Обновились компоненты mdvXXX