Oracle Join Using + производный столбец - PullRequest
0 голосов
/ 21 мая 2018

Я оптимизирую для удобства чтения.Синтаксис SQL-соединения «using» синтаксически менее многословен, чем «on», где это применимо.В идеале я хотел бы написать:

select *, 
  col1 + col2 as derviedCol 
from table1 join table2 using (joinCol1, joinCol2)

, однако oracle (и я подозреваю, что другие БД) не позволят вам использовать идентификатор таблицы при использовании синтаксиса 'using' (ORA-00904), поэтому следующеелучшее, что я могу сделать, это:

select t.*, 
  col1 + col2 as derviedCol 
from (
  select * from table1 join table2 using (joinCol1, joinCol2)
) t

или

select t1.*, t2.*, 
  col1 + col2 as derviedCol 
from table1 t1 
join table2 t2 on 
  t1.joinCol1 = t2.joinCol1 
  and t1.joinCol2 = t2.joinCol2

Может кто-нибудь предложить более лаконичный синтаксис?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы можете назначить псевдонимы и использовать их для квалификации вычислений столбцов;например,

select co.shortname || '.' || ci.shortname as mycol
from countries co
join cities ci using (ISOCODE);

или просто указать столбцы по именам соответствующих таблиц;например,

select countries.shortname || '.' || cities.shortname as mycol
from countries
join cities using (ISOCODE);

Не уверен, соответствует ли это вашему определению "менее многословный"

0 голосов
/ 21 мая 2018

Я оспариваю вводное утверждение и считаю, что "использование синтаксиса" МЕНЬШЕ "чисто".Даже если есть общие имена для объединения, а естественное объединение «скрывает» «дублированное имя столбца», производная таблица может содержать столбцы с одинаковыми именами (например, «короткое имя», показанное ниже, которое существует в обоих, но не существует).часть объединения).

Кроме того, если в «использовании объединения» указаны оба столбца, возвращаются оба столбца, даже если они имеют одинаковое имя столбца.

Для нескольких дополнительных символовв синтаксисе соединения вы получаете гораздо более точный (и гибкий) подход, который можно использовать в любом запросе, не требуя специальных условий модели данных.Я также утверждаю, что синтаксическая согласованность использования объединений в стиле ON приводит к меньшей изменчивости и, следовательно, упрощению обслуживания.

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE COUNTRIES
    (COUNTRY varchar2(9), ISOCODE varchar2(3), SHORTNAME varchar2(4))
;

INSERT ALL 
    INTO COUNTRIES (COUNTRY, ISOCODE, SHORTNAME)
         VALUES ('Aruba', 'ABW', NULL)
    INTO COUNTRIES (COUNTRY, ISOCODE, SHORTNAME)
         VALUES ('Australia', 'AUS', 'Oz')
    INTO COUNTRIES (COUNTRY, ISOCODE, SHORTNAME)
         VALUES ('Austria', 'AUT', NULL)
SELECT * FROM dual
;

CREATE TABLE CITIES
    (ISOCODE varchar2(3), CITY varchar2(9), SHORTNAME varchar2(3))
;

INSERT ALL 
    INTO CITIES (ISOCODE, CITY, SHORTNAME)
         VALUES ('AUS', 'Melbourne', 'Mel')
SELECT * FROM dual
;

Запрос 1 :

select * from countries join cities using (ISOCODE)

Результаты :

| ISOCODE |   COUNTRY | SHORTNAME |      CITY | SHORTNAME |
|---------|-----------|-----------|-----------|-----------|
|     AUS | Australia |        Oz | Melbourne |       Mel |

Запрос 2 :

select * from countries join cities using (ISOCODE,ISOCODE)

Результаты :

| ISOCODE | ISOCODE |   COUNTRY | SHORTNAME |      CITY | SHORTNAME |
|---------|---------|-----------|-----------|-----------|-----------|
|     AUS |     AUS | Australia |        Oz | Melbourne |       Mel |

Запрос 3 :

select * from countries left join cities using (ISOCODE)

Результаты :

| ISOCODE |   COUNTRY | SHORTNAME |      CITY | SHORTNAME |
|---------|-----------|-----------|-----------|-----------|
|     AUS | Australia |        Oz | Melbourne |       Mel |
|     AUT |   Austria |    (null) |    (null) |    (null) |
|     ABW |     Aruba |    (null) |    (null) |    (null) |

Запрос 4 :

select * from countries left join cities using (ISOCODE,ISOCODE)

Результаты :

| ISOCODE | ISOCODE |   COUNTRY | SHORTNAME |      CITY | SHORTNAME |
|---------|---------|-----------|-----------|-----------|-----------|
|     AUS |     AUS | Australia |        Oz | Melbourne |       Mel |
|     AUT |     AUT |   Austria |    (null) |    (null) |    (null) |
|     ABW |     ABW |     Aruba |    (null) |    (null) |    (null) |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...