【问题标题】:Difference between USING and ON in Oracle SQLOracle SQL中USING和ON的区别
【发布时间】:2011-10-25 21:26:10
【问题描述】:

似乎没有区别:

SELECT a.col1, b.col2
  FROM table a JOIN table2 b
 USING (col3)

SELECT a.col1, b.col2
  FROM table a JOIN table2 b
    ON (a.col3 = b.col3)

或者有吗? (当然除了ON,我可以使用不同的列名)

【问题讨论】:

标签: sql oracle join


【解决方案1】:

不多。当然,ON 允许这样做,而 USING 则不允许:

SELECT a.col1, b.col2
  FROM table a JOIN table2 b
    ON (a.col3 = b.col4)
                      ^

这是 ANSI 连接语法,它不是 Oracle 独有的。

【讨论】:

  • 好吧,Oracle 在旧版本的数据库中不支持 ANSI 语法。
  • 没错,我认为最高可达 8i。但他们已经做了大约 12 年了!
  • 这是 9i 的一个新功能,它已经有 10 年历史了。这让我觉得自己老了……
【解决方案2】:

对我来说不同的是,你可以用 USING 子句把自己画到一个角落里:

CREATE TABLE roster (mgrid INTEGER, empid INTEGER);
CREATE TABLE emp (empid INTEGER, NAME VARCHAR2(20));

INSERT INTO roster VALUES (1,10);
INSERT INTO roster VALUES (1,11);
INSERT INTO roster VALUES (1,12);
INSERT INTO roster VALUES (2,20);
INSERT INTO roster VALUES (2,21);

INSERT INTO emp VALUES (10, 'John');
INSERT INTO emp VALUES (11, 'Steve');
INSERT INTO emp VALUES (12, 'Mary');
INSERT INTO emp VALUES (20, 'Ann');
INSERT INTO emp VALUES (21, 'George');
INSERT INTO emp VALUES (1, 'Pete');
INSERT INTO emp VALUES (2, 'Sally');

SELECT r.mgrid, e2.name, e1.empid, e1.name
  FROM roster r JOIN emp e1 USING(empid)
                JOIN emp e2 ON r.mgrid = e2.empid; 

在上面的选择中,你得到一个 ora-25154,“USING 子句的列部分不能有限定符”。

如果您删除 e1.empid 限定符,如:

SELECT r.mgrid, e2.name, empid, e1.name
  FROM roster r JOIN emp e1 USING(empid)
                JOIN emp e2 ON r.mgrid = e2.empid; 

您收到 ORA-00918 错误,“列定义不明确”。

你必须使用:

SELECT r.mgrid, e2.name, e1.empid, e1.name
  FROM roster r JOIN emp e1 ON r.empid = e1.empid
                JOIN emp e2 ON r.mgrid = e2.empid; 

这个例子是人为设计的,但是当我第一次探索连接语法时,我在实际情况中遇到了这个确切的问题。从那以后,我一直避免使用 USING 子句。 USING 子句除了敲几下键外没有其他优势。

【讨论】:

    【解决方案3】:

    ON 包括从连接表连接的所有列,因此您在结果数据集中有两个或多个相同的列类型。

    但是USING 删除了正在连接的列的重复项以保留该类型之一, 这使得它类似于question on natural joins 中突出显示的自然连接(除了它们不必具有相同的名称)

    USING 可能很有用 ;) 用于使用连接表的子查询进行插入(在我的情况下,为数据仓库星型模式展平表,我只想要其中一个 id 列)。

    【讨论】:

      【解决方案4】:

      没有。如果你把语法抛在脑后,那两个句子就没有区别。

      【讨论】:

      • @JeffreyKemp:你能详细说明一下吗?这些句子如何产生不同的结果集?
      • USING 删除在USING 子句中匹配的重复列。 ON 没有。
      猜你喜欢
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      相关资源
      最近更新 更多