2013-04-18 4 views
0

У меня есть таблицы со столбцами, как показано ниже:Чтобы выбрать столбец из таблицы, используя значения из другой таблицы

Сотрудник:

Id number(10), 
Name varchar2(10) 

Факультет:

Id number(10), 
Name varchar2(10), 
Emp_ids varchar2(10) 

The представлены в таблицах соответственно:

Сотрудник:

1,abc,111 
2,def,222 
3,xyz,333 

Факультет:

111,development,'1,2' 
222,testing,'2,3' 

Моя проблема заключается в том, что мне нужно выбрать Employee имена, используя emp_ids столбец из таблицы отдела.

Пример:

SELECT names FROM employee 
WHERE id in (SELECT emp_ids FROM department WHERE name = 'development'); 

Поскольку emp_ids является varchar2 тип данных я не могу выполнить вышеуказанную команду.

ПРИМЕЧАНИЕ. Поскольку я использую Activerecord Base Connection для подключения моей базы данных Oracle от Ruby, я также включаю ruby ​​в теги.

+0

когда вы запускали код 'ВЫБРАТЬ имена ОТ работника WHERE ID в (SELECT emp_ids FROM отдела 'развития' WHERE имя =), ', что вы получили? –

+0

Я сталкиваюсь с ошибкой несоответствия типа данных: ** ORA-01722: недопустимый номер ** – kattashri

+0

Возможный дубликат [как преобразовать csv в таблицу в oracle] (http://stackoverflow.com/questions/3142665/how-to-convert -csv-to-table-in-oracle) – APC

ответ

2

Ваша модель данных плохо разработана. Вы могли построить запрос, который будет работать, но это было бы:

  1. более сложным, чем это необходимо,
  2. в конечном счете неэффективной, так как ваши данные растет в размерах,
  3. открыт к несогласованности, потому что вы не можете определить референтные ограничения должным образом,
  4. наиболее определенно поставщик специфический.

Я предлагаю вам использовать надежную модель данных. У вас есть отношения N-N, вы потребность три таблицы:

Employee (Id number(10) primary key, Name varchar2(10)) 
Department (Id number(10) primary key,Name varchar2(10)) 

Employee_department (
    emp_id number(10) references employee (id), 
    dep_id number(10) references department(id), 
    constraint pk_emp_dept primary key (emp_id, dep_id) 
) 

Тогда ваш запрос будет работать безупречно, эффективно и вы не потеряете сон в ночное время по поводу несогласованности данных.

SELECT names 
    FROM employee 
WHERE id in (SELECT ed.emp_id 
       FROM department d 
       JOIN employee_department ed ON d.id = ed.dep_id 
       WHERE d.name = 'development'); 

Как разработчик базы данных ваши две основные цели:

  • Чтобы убедиться, что данные должным образом сохраняются в базе данных. Больше ничего важнее данных. Если вы не можете доверять своим данным, что хорошего в базе данных? Устранение несоответствий является главным приоритетом.
  • Чтобы сделать приложение без ошибок. Если ваша модель подходит, ваши запросы будут проще, вы будете делать меньше ошибок, ваши приложения будут быстрее и в целом более надежны.
+0

Отлично подходит для обучения. :) –

+0

Да Винсент, вы правы, но моя компания разработала так, чтобы реализовать это. И наш клиент попросил предложить решение с возможным запросом – kattashri

+0

@ kattashri существует множество способов преобразования списка значений типа «csv» в представление, например, с помощью [метода из другого SO] (http: // stackoverflow .com/вопросы/1381256/реверс-в-оракула-это-путь-ZYX к хугу). Однако я должен подчеркнуть, что это обходной путь из-за плохого выбора в модели данных. Вы всегда должны стремиться защитить наиболее подходящую модель данных, потому что это упростит управление данными и приложения в целом станут более надежными :) –

0

Я предлагаю вам изменить структуру вашего стола.

Сотрудник:

id 
    name 
    dept_id 

Факультет:

id 
    name 
+0

Это не отражает бизнес-правила, представленные посланных данных – APC

+0

'объявить @ids NVARCHAR (50) объявить @strsql NVARCHAR (500) выберите @ids = Emp_IDS из tblDepartment где depName = 'DEV' множество @ идентификаторы = '' '' + ЗАМЕНА (@ids, '', '' ' '' ') + '''' набор @strsql = «SELECT название от tblemployee ГДЕ новообращенный (NVARCHAR, id) в ('+ @ids +') ' e xec sp_executesql @ strsql' –

Смежные вопросы