0

我有如下列的表格:

员工:

Id number(10),  
Name varchar2(10) 

部门:

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

表中的值分别为:

员工:

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

部门:

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

我的问题是我需要使用emp_idsDepartment 表中的列选择员工姓名。

例子:

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

由于emp_ids是 varchar2 数据类型,我无法执行上述命令。

注意:当我使用Activerecord Base Connection从 Ruby 连接我的 Oracle DB 时,我也在标签中包含了 ruby​​。

4

2 回答 2

2

您的数据模型设计不当。您可以构建一个可以工作的查询,但它会是:

  1. 比需要的更复杂,
  2. 随着数据规模的增长,最终效率会降低,
  3. 容易出现不一致,因为您无法正确定义引用约束,
  4. 最肯定是供应商特定的。

我建议您使用可靠的数据模型。你有一个NN关系,你需要三个表:

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');

作为数据库开发人员,您的两个主要目标是:

  • 确保数据正确保存到数据库中。没有什么比数据更重要了。如果您不能信任您的数据,那么数据库有什么用?消除不一致是重中之重。
  • 制作一个没有错误的应用程序。如果你的模型合适,你的查询会更简单,你会犯更少的错误,你的应用程序会更快,通常更可靠。
于 2013-04-18T10:09:56.040 回答
0

我建议你改变你的表结构。

员工:

   id 
   name
   dept_id

部门:

   id 
   name
于 2013-04-18T10:11:36.400 回答