如何在同一个表中内部联接并联接具有不同标题的外键?

  • 本文关键字:标题 同一个 内部 sql oracle join
  • 更新时间 :
  • 英文 :


示例数据:

id_num: 1, 2, 3, 4
name: bob, lee, john, gary

我正在尝试将同一表中的相应数据与名称匹配。

SELECT e.ID_NUM as "ID NUMBER", 
b.NAME as "Name"
FROM EMPLOYEE E
JOIN EMPLOYEE B on E.ID_NUM = B.NAME

我收到">无效号码"错误。

我的第二个问题是,如何在 two2 个不同的表中连接具有不同名称但值相同的外键?

table: example1
id_num: 1, 2, 3, 4
table: example2
emp_num: 1, 2, 3, 4

这是我到目前为止所做的:

SELECT e.id_num
FROM example1 e, 
example2 b 
WHERE e.id_num = b.emp_num
GROUP BY e.id_num

关于你的第一个问题,正如@Barmar所说,你根本不需要joinSELECT ID_NUM, NAME FROM EMPLOYEE会返回你需要的东西。

但是,如果出于任何其他原因需要将表与表本身联接,则必须在相同类型的列上执行此操作;您得到的错误是因为ID_NUM是一个数字,NAME是文本,所以它们没有可比性。相反,这在语义上是正确的

SELECT  e.ID_NUM as "ID NUMBER",
b.NAME as "Name"
FROM    EMPLOYEE E
JOIN    EMPLOYEE B
ON      E.ID_NUM = B.ID_NUM

关于第二个问题,这种写作方式已经过时了 30 年,正确的写作方式是使用您之前使用的语法

SELECT  e.id_num
FROM    example1 e
JOIN    example2 b 
ON      e.id_num = b.emp_num

你甚至不需要GROUP BY子句,因为在SELECT中没有聚合函数(如总和或计数)。

">

我收到"无效数字"错误。

您正在将数值与字符串进行比较。在计算此类条件时,Oracle 会将字符串强制转换为数字。Oracle 为我们提供了怀疑的好处,并假设字符串列包含类似'1234'的数值。在您的情况下,它失败是因为'lee'不是有效数字,'gary'也不是。

您可以通过显式转换数字列来解决此问题:

SELECT e.ID_NUM as "ID NUMBER", 
b.NAME as "Name"
FROM EMPLOYEE E
JOIN EMPLOYEE B on to_char(E.ID_NUM) = B.NAME

现在,您正在将字符串与字符串进行比较,这样就不会收到转换错误。当然,您也不会得到行,因为'gary' != '1'.不确定您要尝试实施什么业务规则,所以我无法为您修复。

"如何在 2 个不同的表中连接名称不同但值相同的外键?">

使用上一个查询中的 ANSI 92 联接语法。您不需要 GROUP BY,因为您不会聚合任何内容。如果要显示不同的名称,则需要为它们提供别名以区分它们:

SELECT e.id_num,
e.name as e_name, 
b.name as b_name
FROM example1 e
join example2 b 
on  e.id_num = b.emp_num

最新更新