SQL Oracle使用USE?

guz6ccqo  于 2023-05-22  发布在  Oracle
关注(0)|答案(3)|浏览(217)

我正在尝试使用“USING”而不是“ON”来进行查询。
问题是,在**“Employees”表中,它被称为“codigo”,而在“trabajan”表中,它被称为“cod_emp”**。
使用USING,您将如何连接这两个表?根据Oracle文档,这是可能的,但我不能得到它。

SELECT NOMBRE, FUNCION
FROM EMPLEADOS
JOIN TRABAJAN USING (CODIGO,COD_EMP);

Oracle文档中的示例:https://docs.oracle.com/javadb/10.6.2.1/ref/rrefsqljusing.html
下一个查询与上面的查询类似,但它具有额外的连接条件COUNTRIES.COUNTRY_ISO_CODE等于CITIES.COUNTRY_ISO_CODE:

SELECT * FROM COUNTRIES JOIN CITIES
    USING (COUNTRY, COUNTRY_ISO_CODE)
xam8gpfp

xam8gpfp1#

来自Oracle 19c文档,而不是您链接到的JavaDB文档,并强调了以下内容:
当指定两个表中同名列的等联接时,USING列子句指示要使用的列。**仅当两个表中的联接列具有相同的名称时,才可以使用此子句。**在此子句中,不要使用表名或表别名来限定列名。
如果你真的必须使用USING进行赋值,那么你可以这样做,如果你在子查询中对其中一个列名使用别名:

SELECT NOMBRE, FUNCION
FROM (
  SELECT CODIGO AS COD_EMP, NOMBRE FROM EMPLEADOS
)
JOIN TRABAJAN USING (COD_EMP);

这似乎不是很“舒服”。使用ON来处理名称差异更简单:

SELECT NOMBRE, FUNCION
FROM EMPLEADOS
JOIN TRABAJAN ON CODIGO = COD_EMP;

fiddle
用表名或别名限定所有列名也是一个好主意,这样你就可以看到每一列来自哪里,你可以使用表别名来缩短它,例如。

SELECT E.NOMBRE, T.FUNCION
FROM EMPLEADOS E
JOIN TRABAJAN T ON E.CODIGO = T.COD_EMP;

(But你 * 不要 * 用USING限定公共列,我个人觉得这很混乱,这也是避免这种形式的连接语法的另一个原因。

u0sqgete

u0sqgete2#

为什么你不应该在Oracle中使用“USE”?快速的咆哮

  • 列名不匹配时无法使用
  • 特定于Oracle且不可移植
  • 绝对不添加任何值,因为它纯粹是语法糖。
  • 因为它是语法糖,所以很难与使用标准语法的其他情况进行比较。

简而言之,永远不要使用自然连接。

pkwftd7m

pkwftd7m3#

我会避免这样的连接定义。我宁愿写下面这样:

SELECT NOMBRE, FUNCION
FROM EMPLEADOS e
JOIN TRABAJAN t on e.CODIGO=t.COD_EMP;

这样更清晰,并允许更复杂的连接条件。还要注意别名的使用,如果select语句中的两个或多个不同的表中有同名的列,这一点非常重要。我从来没有使用过这种方式来编写连接或所谓的自然连接,也从来没有觉得我需要这样做。

相关问题