示例数据:
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所说,你根本不需要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
中没有聚合函数(如总和或计数)。
我收到"无效数字"错误。
您正在将数值与字符串进行比较。在计算此类条件时,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