Oracle查询中的重复表

时间:2013-05-02 19:50:30

标签: sql oracle

我有一个如下所示的查询:

SELECT *
FROM
  employees e,
  departments d1,
  departments d2,
  departments d3,
  departments d4
WHERE e.dep1 = d1.dep(+)
AND e.dep2 = d2.dep(+)
AND e.dep3 = d3.dep(+)
AND e.dep4 = d4.dep(+);

有没有更好的方法来编写它,这样我就不需要多次在查询中使用相同的表了?我知道Oracle的优化器可能会很好地解决这个问题,但是如果有一种更有效的方法来编写这样的查询,我会全神贯注。请记住,上面只是一个例子,我的实际查询中还有很多内容。我在Windows 2003 x64上使用Oracle 11.2.0.3。

谢谢, 汤姆

3 个答案:

答案 0 :(得分:1)

这完全有效。

我和我的同事经常使用的人为例子是city_of_birthcity_of_residence。假设我们想要查询现在居住在他们所在的不同国家的员工(并且所有国家都有州)。

您可以按如下方式查询:

select e.*
from employees e,
     cities city_of_birth,
     cities city_of_residence,
     states state_of_birth,
     states state_of_residence
where e.city_of_birth_id = city_of_birth.id
  and e.city_of_residence_id = city_of_residence.id
  and city_of_birth.state_id = state_of_birth.id
  and city_of_residence.state_id = state_of_residence.id
  and state_of_birth.country_id != state_of_residence.country_id;

需要注意的是,需要在查询的from子句中引用表,因为它们的含义不同。

考虑它的另一种方法:如果你要从每个“实例”中选择不同的行,你需要在from子句中多次引用同一个表。

答案 1 :(得分:0)

如果您希望所有部门的详细信息在一行中平放,则需要多个连接,但我建议以这种方式编写:

SELECT *
  FROM employees e
 LEFT JOIN departments d1 on (   d1.dep = e.dep1 ) 
 LEFT JOIN departments d2 on (   d2.dep = e.dep1 ) 
 LEFT JOIN departments d3 on (   d3.dep = e.dep1 ) 
 LEFT JOIN departments d4 on (   d4.dep = e.dep1 ) 

答案 2 :(得分:-1)

这对我来说没有多大意义......你正在比较一个员工找到他们的部门(当他们在非规范化的列中有很多可能的时候) - 使用OR子句怎么样......

SELECT *
FROM
  employees e,
  departments d
WHERE ( e.dep1 = d.dep
OR e.dep2 = d.dep
OR e.dep3 = d.dep
OR e.dep4 = d.dep );

或更好 - 重做你的桌子,使其结构合理。 :)