0

抱歉标题令人困惑。当我第二次阅读时,我自己并没有理解它。

所以这里是详细描述。

我有一张表说“奖励”,其中有以下列:姓名、金额、员工

和另一个具有以下列的表“Employee”:Emp_Id,Emp_Name

在“奖励”表的员工列中,我的值“01,20”实际上是引用“员工”表的员工 ID。

那么有什么方法可以在选择“奖励”查询中获取员工姓名?

4

3 回答 3

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   )
于 2013-08-17T10:45:47.423 回答
1

这是一种方法:

select a.*, e.EmpName
from Awards a join
     Employees e
     on ','||a.employee||',' like '%,'||e.emp_id||',%';

这将在单独的行上返回员工姓名。如果您希望将它们放在一个列表中,那么您需要将它们连接在一起(这样做的最佳功能取决于您的 Oracle 版本)。

顺便说一句,这是一个非常糟糕的数据结构,您应该有一个关联表 AwardEmployee,其中每一行和每个员工都有一行。

于 2013-08-17T13:03:22.500 回答
0

我已经更改了数据库(又添加了一张表)。并且已经开始更改代码,至于我使用的上述报告如下

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

这是暂时的,我对此了解得很少。

感谢您的帮助和建议。

于 2013-08-22T05:39:26.997 回答