Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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


 
Johnmen ©   (2004-12-08 11:10) [41]

Существует 2 вида соединения, внутреннее и внешнее.
При этом внешнее м.б. только одного вида (LEFT, RIGHT или FULL).
См. документацию SQL Reference Help на SELECT.


 
Sirus   (2004-12-08 11:31) [42]

Вобщем спасибо всем... На всякий случай сохраню этот обсуждение полностью.
А в документации SQL reference Help на SELECT нет почти никакого описания JOIN. Там просто указано как правильно писать слово JOIN и какие они бывают. Но не указано что они делают (по отдельности не указано)


 
Zacho ©   (2004-12-08 12:05) [43]

Sirus   (08.12.04 11:31) [42]

Советую почитать "SQL" М.Грабера.



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.046 c
3-1102609838
mefisto
2004-12-09 19:30
2005.01.09
Вставка в ячейку DBGrid ProgressBar !!!


14-1103224286
Chuvak
2004-12-16 22:11
2005.01.09
ЖК-монитор и глаза


4-1101038692
grigory
2004-11-21 15:04
2005.01.09
FAT


4-1101128855
Новик
2004-11-22 16:07
2005.01.09
Выделить часть текста в чужом окне


3-1102607156
hawkins
2004-12-09 18:45
2005.01.09
не работает IBSQLMonitor





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский