如何在同一个表中加入内联并使用不同的标题加入外键?

时间:2017-04-08 07:57:33

标签: 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

我收到“无效号码”错误。

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

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

2 个答案:

答案 0 :(得分:0)

关于你的第一个问题,正如@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中没有聚合函数(如sum或count)。

答案 1 :(得分:0)

  

“我收到”无效号码“错误。”

您正在将数值与字符串进行比较。在评估此类条件时,Oracle会将字符串转换为数字。 Oracle为我们带来了疑问,并假设字符串列包含'1234'之类的数值。在您的情况下,它会失败,因为'lee'不是有效数字,'gary'也不是。{1}}。

你可以通过对数字列进行显式转换来解决这个问题:

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'。不确定您要尝试实施的业务规则,因此我无法为您解决此问题。

  

“我如何在两个不同的表中加入具有不同名称但相同值的外键?”

使用先前查询中的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