使用另一个表中的值从表中选择列

时间:2013-04-18 09:50:00

标签: ruby oracle rubygems oracle10g oracle11g

我的表格列如下:

员工:

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'

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

示例:

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。

2 个答案:

答案 0 :(得分:2)

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

  1. 比需要的更复杂,
  2. 随着数据规模的增长,效率最低,
  3. 因为无法正确定义参照约束而导致不一致,
  4. 肯定是供应商特定的。
  5. 我建议你使用可靠的数据模型。你有一个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');
    

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

    • 确保将数据正确保存到数据库中。没有比数据更重要的了。如果您不能信任您的数据,那么数据库有什么用处?消除不一致是首要任务。
    • 制作无错误的应用程序。如果您的模型合适,您的查询将更简单,您将减少错误,您的应用程序将更快,通常更可靠。

答案 1 :(得分:0)

我建议你改变你的桌面结构。

<强>员工:

   id 
   name
   dept_id

<强>系:

   id 
   name