示例数据:
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
答案 0 :(得分:0)
关于你的第一个问题,正如@Barmar所说,你根本不需要join
,SELECT 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