我质疑开场白,并认为“使用语法”不太“干净”。即使有要通过的通用名称进行连接,并且自然连接“隐藏”了“重复的列名”,派生表仍然可以包含相同名称的列(例如,下面看到的“shortname”在两者中都存在但不存在连接的一部分)。
此外,如果“使用连接”指定了两个列,则返回两个列,即使它们具有相同的列名。
对于连接语法中的一些额外字符,您可以获得更精确(和灵活)的方法,可以在任何查询中使用,而无需特殊的数据模型条件。我还认为,使用 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) |