Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / JOIN USING() / 13 сообщений из 13, страница 1 из 1
14.05.2021, 17:57
    #40070416
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
Поискал в форуме, похоже только Алибек про такой синтакс писал за последние два года, и то вопросы.

Попробовал использовать в новом коде ожидая обещанных облегчений со звездочками, но в 11г решение не допилено: tab.* дает ошибку.

Кто не в курсе, использование USING() в джойнах позволяет схлопнуть одноименные ключи, тем самым позволяя использовать * и tab.* в подчиненных запросах не прибегая к алиасам.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with bazar(n,ru) as ( 
  select rownum, trim(column_value) from XMLTABLE('"один","два","три","четыре"')
),
habla(n,es) as (
  select rownum, trim(column_value) from XMLTABLE('"uno","dos","tres"')
  union
  select 5, 'пять' from dual
),
speak(n,en) as (
  select rownum+1, trim(column_value) from XMLTABLE('"two","three","four"')
),
polyglot as (
  select * -- заветная звездочка
    from bazar 
    full outer join habla using (n)
    full outer join speak using (n)
)
-- во внутренних запросах звездочки, в наружном буквально
select n, en,es,ru 
  from polyglot order by n



Но, как уже сказано выше на 11г звездочка только сама по себе и работает.
В отличие от ANSI "on", Using() не дает уточнить условие джойна через and/or.

Т.е. ограниченное использование, но я нашел по крайней мере две ситуации, где оказался полезен:
- он красиво сливает ключ в единый столбец для невнутренних джойнов, как в примере выше
- позволяет чисто и кратко записать джоийны по составным ключам, где важен порядок частей составного ключа.
...
Рейтинг: 0 / 0
14.05.2021, 18:29
    #40070428
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
НеофитSQL
Но, как уже сказано выше на 11г звездочка только сама по себе и работает.
Чудак, что конкретно не работает в соответствии с документацией?

З.Ы. Дима, хоть демократически ты был не прав, но по совокупности козлы есть везде :/
...
Рейтинг: 0 / 0
14.05.2021, 18:53
    #40070432
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
Elic,

Для меня в 11g не работает следующее: (ОRА-00904)

Код: plsql
1.
2.
3.
4.
5.
6.
polyglot as (
  select n, b.*, h.*, s.*
    from bazar b
    full outer join habla h using (n)
    full outer join speak s using (n)
)



Документация говорит, что это работало в 10ке: https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljusing.html
An asterisk qualified by a table name (for example, COUNTRIES.*) will be expanded to every column of that table that is not listed in the USING clause.

Возможно, я что-то делаю не так. Подскажите, как надо.
...
Рейтинг: 0 / 0
14.05.2021, 20:43
    #40070465
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
Если у кого-то join using()/tab.* получилось как в документации, отзовитесь.

Не может быть что я первый такое нашел. Базовые вроде вещи..
...
Рейтинг: 0 / 0
15.05.2021, 06:40
    #40070501
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
Еще бы ты документацию про Oracle DB смотрел
...
Рейтинг: 0 / 0
15.05.2021, 14:12
    #40070526
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
НеофитSQL
Код: plsql
1.
2.
3.
4.
select n, b.*, h.*, s.*
    from bazar b
    full outer join habla h using (n)
    full outer join speak s using (n)

На мой взгляд, это не может работать в SQL. Не указано из какой таблицы должно быть поле n в секции SELECT.
...
Рейтинг: 0 / 0
15.05.2021, 14:27
    #40070527
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
miksoft
НеофитSQL
Код: plsql
1.
2.
3.
4.
select n, b.*, h.*, s.*
    from bazar b
    full outer join habla h using (n)
    full outer join speak s using (n)


На мой взгляд, это не может работать в SQL. Не указано из какой таблицы должно быть поле n в секции SELECT.
Хм, таки может
https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10002.htmUSING column
In an outer join with the USING clause, the query returns a single column which is a coalesce of the two matching columns in the join. The coalesce functions as follows:

COALESCE (a, b) = a if a NOT NULL, else b.

Therefore:

A left outer join returns all the common column values from the left table in the FROM clause.

A right outer join returns all the common column values from the right table in the FROM clause.

A full outer join returns all the common column values from both joined tables.
...
Рейтинг: 0 / 0
15.05.2021, 14:32
    #40070528
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
НеофитSQL
Если у кого-то join using()/tab.* получилось как в документации, отзовитесь.

Не может быть что я первый такое нашел. Базовые вроде вещи..


Смотрим в книгу... Ну и где "как в документации"? Где ты там видишь alias.*? Начни читать доку:

USING (column)
When you are specifying an equijoin of columns that have the same name in both
tables, the USING column clause indicates the columns to be used. You can use this
clause only if the join columns in both tables have the same name. Within this clause,
do not qualify the column name with a table name or table alias.


А для неофитов я бы еще добавил "explicitly or implicitly":

SY.
...
Рейтинг: 0 / 0
15.05.2021, 14:50
    #40070530
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
И если запрос написать только с одним джойном, то ошибка получается более "говорящая":
Код: plsql
1.
2.
3.
select n, t1.*, t2.*
from t1
full outer join t2 using(n)

ORA-25154: column part of USING clause cannot have qualifier
...
Рейтинг: 0 / 0
15.05.2021, 22:21
    #40070553
ASNexus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
Да. Но формально, для неофитов, как раз таки внимательно читающих документацию, но не понимающих суть, здесь сказано, что

SY
НеофитSQL
Если у кого-то join using()/tab.* получилось как в документации, отзовитесь.

Не может быть что я первый такое нашел. Базовые вроде вещи..


Смотрим в книгу... Ну и где "как в документации"? Где ты там видишь alias.*? Начни читать доку:

USING (column)
When you are specifying an equijoin of columns that have the same name in both
tables, the USING column clause indicates the columns to be used. You can use this
clause only if the join columns in both tables have the same name. Within this clause ,
do not qualify the column name with a table name or table alias.


А для неофитов я бы еще добавил "explicitly or implicitly":

SY.


Могли бы, конечно, и дописать, что и в select list такие поля не могут иметь квалификацию. Тогда таких вопросов (а по сути - открытий "нас обманывают" ) не было бы.
...
Рейтинг: 0 / 0
16.05.2021, 01:06
    #40070567
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
ASNexus

Могли бы, конечно, и дописать, что и в select list такие поля не могут иметь квалификацию. Тогда таких вопросов (а по сути - открытий "нас обманывают" ) не было бы.


Так они нигде не могут иметь квалификацию, ни в select list, ни в where clause ни в group by ни в order by ибо поля из using это "собирательный образ".

SY.
...
Рейтинг: 0 / 0
16.05.2021, 01:09
    #40070568
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> select e.* from emp e join dept d using(deptno) where d.deptno = 20;
select e.* from emp e join dept d using(deptno) where d.deptno = 20
                                                      *
ERROR at line 1:
ORA-25154: column part of USING clause cannot have qualifier


SQL> select e.* from emp e join dept d using(deptno) group by e.deptno;
select e.* from emp e join dept d using(deptno) group by e.deptno
                                                         *
ERROR at line 1:
ORA-25154: column part of USING clause cannot have qualifier


SQL> select e.* from emp e join dept d using(deptno) order by e.deptno;
select e.* from emp e join dept d using(deptno) order by e.deptno
                                                         *
ERROR at line 1:
ORA-25154: column part of USING clause cannot have qualifier


SQL>



SY.
...
Рейтинг: 0 / 0
16.05.2021, 02:23
    #40070572
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN USING()
Вячеслав Любомудров
Еще бы ты документацию про Oracle DB смотрел


Лол, действительно! Ссылка на док (которую мне не удалось найти для 11.2) на самом деле для какой-то JavaDB ор Оракла, и я этого совершенно не заметил.

Разработчики JavaDB предусмотрительно сделали определение table.* в таких джойнах так, чтобы оно исключало колонку которая фигурирует в USING().

Поэтому в этой самой JavaDB можно писать e.* и d.*, a в Оракле - нет.
Я не заметил "javadb" в URL, пока Вячеслав не указал на мою ошибку.

Ради своего интереса, прогнал такой джойн через разные БД в dbfiddle. DB2, MS SQL и другие такой синтакс разрешают, но ни одна не работает так, как JavaDB - во всех ключ джойна сохраняется в tab.*, и на него можно ссылаться и с квалифаером, и без.

Мой вопрос отвечен, спасибо всем кто поучаствовал.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / JOIN USING() / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]