Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.165.131] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Всем здравствуйте!
На Oracle 8 - ORA-00933, на Oracle 12 всё ОК. Это говорит о том, что восьмёрка не знает джойнов??? Прикреплённый файл1.png (17,37 Кбайт, скачиваний: 569) |
Сообщ.
#2
,
|
|
|
ЕМНИП Oracle поддерживать начал эту нотацию только с девятки.
под восьмеркой приходилось пользоваться "(+)" для лефтов |
Сообщ.
#3
,
|
|
|
да, в старых ораклах join писался в where типа такого
select a.*, b.* from a,b where a.id=b.a_id; Цитата Anykey @ под восьмеркой приходилось пользоваться "(+)" для лефтов (+) нужен для outer join PS: кстати для сложных запросов лучше и сегодня эту конструкцию использовать. Даже не знаю почему, но есть случаи когда работает правильнее и быстрее. Во всяком случае в 11. |
Сообщ.
#4
,
|
|
|
Спасибо!
|
Сообщ.
#5
,
|
|
|
Цитата vladimir74 @ да, в старых ораклах join писался в where типа такого Но указанный тобой пример - это CROSS JOIN. А LEFT JOIN работает по-другому. |
Сообщ.
#6
,
|
|
|
SELECT * FROM tab1 LEFT JOIN tab2 ON col1=col2 - аналогичен запросу: SELECT * FROM tab,tab2 WHERE col1=col2 (+) SELECT * FROM tab1 RIGHT JOIN tab2 ON col1=col2 - аналогичен запросу: SELECT * FROM tab,tab2 WHERE col1 (+)=col2 |
Сообщ.
#7
,
|
|
|
Bas, частные случаи совпадения конечно же могут быть.
Но следует помнить, что в CROSS JOIN'е в директиве WHERE - указывается "по каком условию фильтровать". А в директиве ON - указывается "по какому условию клеить". Несколько иной функционал, не правда ли? |
Сообщ.
#8
,
|
|
|
Для примера. Берем CROSS JOIN ...
... какой бы мы фильтр во WHERE не мастерили, следующего результата мы не получим: |
Сообщ.
#9
,
|
|
|
Цитата JoeUser @ Но указанный тобой пример - это CROSS JOIN. может я забутался в абривиатурах, но мне всегда казалось что CROSS JOIN это вот так with t1 as( select 1 id, 'Ivan' name, 1 rid from dual union all select 2 id, 'Michael' name, 2 rid from dual union all select 3 id, 'Jon' name , 3 rid from dual union all select 4 id, 'Luis' name, 4 rid from dual ), t2 as( select 1 id, 'Buro1' raum from dual union all select 2 id, 'Buro2' raum from dual union all select 3 id, 'Buro3' raum from dual ) select * from t1,t2 Цитата JoeUser @ ... какой бы мы фильтр во WHERE не мастерили, следующего результата мы не получим: разве не так? with t1 as( select 1 id, 'Ivan' name, 1 rid from dual union all select 2 id, 'Michael' name, 2 rid from dual union all select 3 id, 'Jon' name , 3 rid from dual union all select 4 id, 'Luis' name, 4 rid from dual ), t2 as( select 1 id, 'Buro1' raum from dual union all select 2 id, 'Buro2' raum from dual union all select 3 id, 'Buro3' raum from dual ) select * from t1,t2 where t1.rid=t2.id(+) ; |
Сообщ.
#10
,
|
|
|
господа, а зачем всегда что-то прописывать в where?
кросс джойн тем и отлчается что они ни по каким колонкам ни "клеится" и не "фильтруется" а вот реализовать в старой нотации, без джойнов, full outer join одним where уже не получалось. всегда приходилось делать left union right. |
Сообщ.
#11
,
|
|
|
Цитата Anykey @ господа, а зачем всегда что-то прописывать в where? так я вроде так и написал. Цитата Anykey @ а вот реализовать в старой нотации, без джойнов, full outer join одним where уже не получалось. всегда приходилось делать left union right. через UNION можно было, что то типо этого (хотя да заморочно) with t1 as( select 1 id, 'name1' name, 1 rid from dual union all select 2 id, 'name2' name, 2 rid from dual union all select 3 id, 'name3' name , 3 rid from dual union all select 4 id, 'name4' name , 4 rid from dual union all select 5 id, 'name5' name , 7 rid from dual union all select 6 id, 'name6' name , 8 rid from dual union all select 7 id, 'name7' name, 9 rid from dual ), t2 as( select 1 id, 'Buro1' raum from dual union all select 2 id, 'Buro2' raum from dual union all select 3 id, 'Buro3' raum from dual union all select 4 id, 'Buro4' raum from dual union all select 5 id, 'Buro5' raum from dual ) SELECT t1.*, t2.* FROM t1,t2 WHERE t1.rid=t2.id(+) UNION ALL SELECT t1.*, t2.* FROM t1,t2 WHERE t1.rid(+)=t2.id AND t1.id is null; PS: я в принципе люблю JOIN-ы т.к. они более понятны, но к сожалению работая со сложными запросами и большими таблицами приходится возвращаться к старому синтаксису. Кстати в 11g тоже Join-ы долго фиксили, а в связке с XML вообще до 11.2.0.3 они нормально не работали. Вот такие Ораклописцы злые |
Сообщ.
#12
,
|
|
|
Цитата vladimir74 @ разве не так? Нет, кросс-джоин клеит "всех-со-всеми". LEFT(или RIGHT) OUTER JOIN может клеить еще и NULL значения. Когда соответствия не найдено. В этом разница. В ряде случаев это важно. Пример: есть стандартный перечень чего-то, по этому выполняется что-то, задача - посчитать сколько выполнилось. В случае с LEFT OUTER JOIN это решается правильно и изящно. В случае с CROSS JOIN мы найдем все выполненные хотя бы раз, но ... мы не найдем невыполненные! "Нули" тупо теряем. А оч часто это важно. |
Сообщ.
#13
,
|
|
|
CROSS JOIN - формально это INNER JOIN без условий связывания. О чём вообще спор-то?
|
Сообщ.
#14
,
|
|
|
Цитата Akina @ CROSS JOIN - формально это INNER JOIN без условий связывания. О чём вообще спор-то? о старом оракловском синтаксисе, я надеюсь Цитата JoeUser @ Нет, кросс-джоин клеит "всех-со-всеми". LEFT(или RIGHT) OUTER JOIN может клеить еще и NULL значения. Когда соответствия не найдено. В этом разница. В ряде случаев это важно. ну так возьми мои запросы и проверь, они же все действующие |
Сообщ.
#15
,
|
|
|
Цитата vladimir74 @ ну так возьми мои запросы и проверь, они же все действующие Не вижу необходимости. Ибо потратил вечерок на изучение) Потрать и ты) |