2013-08-17 1 views
0

Извините за запутанное название. Я сам не понял его, когда прочитал его второй раз.Oracle Comma Separated Value (ID) в столбце. Как получить описание для каждого значения в строке, разделенной запятыми.

Так вот описание деталей.

У меня есть таблица говорят "награды", которые имеют следующий столбец: Имя, Сумма, Сотрудник

и другой таблице "Сотрудник", которые имеют следующие колонки: emp_id, Emp_Name

и в столбце сотрудника таблицы «Награды» у меня есть значение «01,20», которые на самом деле являются идентификатором сотрудника, указанным в таблице «Сотрудник».

Итак, есть ли способ получить имя сотрудника в запросе «Награды»?

+3

Да, измените свою схему, таблица вознаграждений должна быть переработана с одной строкой в ​​отношении вознаграждения/сотрудника. (Это, вероятно, означает еще одну таблицу, если вы хотите нормально нормализовать.) – Mat

+0

@Mat Спасибо за предложение и да, это правильный путь, но в моем случае, если я изменю дизайн таблицы, мне придется изменить код (вставка, обновление) на страницах приложений, и я не хочу сейчас переходить в код. – user2691287

+0

Чем больше вы ждете, чтобы сделать это, тем труднее это получится. – Mat

ответ

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 

Что является временным, и я понимаю очень меньше.

Спасибо за помощь и предложение.

1

Ниже приведен запрос получения разделенных идентификаторами сотрудников в виде строк, которые я помещал в подзапрос, чтобы получить их имя. Пожалуйста, отредактируйте в соответствии с вашими ewquirements.

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 ) 
+0

Спасибо за ответ. Я пробовал запрос, но не смог добавить предложение where к подзапросу (выберите триммеры ...). Я продолжаю получать правильную ошибку SQL Command. И также я думаю, что если столбец Employee в Award имеет значение «6,26», тогда я получу две разные строки. Вместо этого я хочу «Prashant, Anil» в одном столбце Только если это возможно. Еще раз спасибо. – user2691287

+0

1) Был один дополнительный кронштейн, который бы дал вам проблему. 2) Вы получаете разные имена в строках, пожалуйста, добавьте их снова. – Harshit

1

Вот один метод:

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

Это будет возвращать имена сотрудников на отдельных линиях. Если вы хотите, чтобы они были в списке, вам необходимо объединить их вместе (и лучшая функция для этого зависит от вашей версии Oracle).

Кстати, это очень плохая структура данных. У вас должна быть таблица ассоциаций AwardEmployee, которая имеет одну строку для каждой строки и каждого сотрудника.