我正在优化可读性。 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
有人可以建议更简洁的语法吗?
答案 0 :(得分:0)
我挑战开场陈述,并坚持使用语法"很少"干净"。即使有通用名称加入,自然加入"隐藏" "重复的列名称",派生表仍然可以包含相同名称的列(例如"短名称"见下面,它们存在于两个但不是连接的一部分)
此外,如果'使用加入'指定两列,然后返回两列,即使它们具有相同的列名。
对于连接语法中的一些额外字符,您可以获得更精确(和灵活)的方法,可以在任何查询中使用,而无需特殊的数据模型条件。我还认为使用ON样式连接的语法一致性导致更少的可变性,从而更容易维护。
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);
不确定这是否符合“较少详细”的定义