抱歉标题令人困惑。当我第二次阅读时,我自己并没有理解它。
所以这里是详细描述。
我有一张表说“奖励”,其中有以下列:姓名、金额、员工
和另一个具有以下列的表“Employee”:Emp_Id,Emp_Name
在“奖励”表的员工列中,我的值“01,20”实际上是引用“员工”表的员工 ID。
那么有什么方法可以在选择“奖励”查询中获取员工姓名?
下面给出了以行的形式获取逗号分隔的员工 ID 的查询,我将其放入子查询中以获取他们的姓名。请根据您的需求进行编辑。
Select Ename from employee where employee_id in (
SELECT trim(x.column_value.extract('e/text()')) COLUMNS
from awards t, table (xmlsequence(xmltype('<e><e>' || replace(Employee,':','</e><e>')||
'</e></e>').extract('e/e'))) x )
这是一种方法:
select a.*, e.EmpName
from Awards a join
Employees e
on ','||a.employee||',' like '%,'||e.emp_id||',%';
这将在单独的行上返回员工姓名。如果您希望将它们放在一个列表中,那么您需要将它们连接在一起(这样做的最佳功能取决于您的 Oracle 版本)。
顺便说一句,这是一个非常糟糕的数据结构,您应该有一个关联表 AwardEmployee,其中每一行和每个员工都有一行。
我已经更改了数据库(又添加了一张表)。并且已经开始更改代码,至于我使用的上述报告如下
WITH t AS
(
Select emp_name from employee where emp_id in (
select regexp_substr(Employee ,'[^,]+', 1, level) from awards
connect by regexp_substr((select Employee from awards ), '[^,]+', 1, level) is
not null)
)
SELECT LTRIM(SYS_CONNECT_BY_PATH(emp_name, ','),',') emp_name
FROM ( SELECT emp_name,
ROW_NUMBER() OVER (ORDER BY emp_name) FILA
FROM t )
WHERE CONNECT_BY_ISLEAF = 1
START WITH FILA = 1
CONNECT BY PRIOR FILA = FILA - 1
这是暂时的,我对此了解得很少。
感谢您的帮助和建议。