很抱歉这个令人困惑的标题。我第二次读它的时候自己并不理解。
所以这里是详细说明。
我有一张表说“奖励”,其中包含以下列: 名称, 量, 雇员
和另一个表“Employee”,其中包含以下列: EMP_ID, EMP_NAME
并且在“奖励”表的员工列中,我有值“01,20”,它实际上是“员工”表中引用的员工ID。
那么有什么方法可以在选择“奖励”查询中获得员工姓名吗?
答案 0 :(得分:1)
下面给出了以行的形式获取逗号分隔的员工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 )
答案 1 :(得分:1)
这是一种方法:
select a.*, e.EmpName
from Awards a join
Employees e
on ','||a.employee||',' like '%,'||e.emp_id||',%';
这将在不同的行上返回员工姓名。如果你想要它们在列表中,那么你需要将它们连接在一起(这样做的最佳功能取决于你的Oracle版本)。
顺便说一下,这是一个非常糟糕的数据结构,你应该有一个关联表AwardEmployee,每行和每个员工都有一行。
答案 2 :(得分:0)
我更改了数据库(添加了一个表)。并且已经开始更改CODE,就像上面的报告我使用了以下
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
这是暂时的,我对它的理解非常少。
感谢您的帮助和建议。