Oracle Join使用+派生列

时间:2018-05-21 07:51:30

标签: sql oracle

我正在优化可读性。 SQL join“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 :(得分:0)

我挑战开场陈述,并坚持使用语法"很少"干净"。即使有通用名称加入,自然加入"隐藏" "重复的列名称",派生表仍然可以包含相同名称的列(例如"短名称"见下面,它们存在于两个但不是连接的一部分)

此外,如果'使用加入'指定两列,然后返回两列,即使它们具有相同的列名。

对于连接语法中的一些额外字符,您可以获得更精确(和灵活)的方法,可以在任何查询中使用,而无需特殊的数据模型条件。我还认为使用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)

<强> Results

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

查询2

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

<强> Results

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

查询3

select * from countries left join cities using (ISOCODE)

<强> Results

| 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)

<强> Results

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

答案 1 :(得分:0)

您可以指定别名并使用它们来限定列计算; e.g。

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

或简单地按列各自的表名限定列; e.g。

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

不确定这是否符合“较少详细”的定义