1

我有一个看起来像这样的查询:

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。

谢谢,汤姆

4

3 回答 3

1

这是完全有效的。

我和我的同事经常使用的人为示例是city_of_birthand city_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另一种思考方式:如果要从每个“实例”中选择不同的行,则需要在子句中多次引用同一个表。

于 2013-05-02T20:21:40.103 回答
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 ) 
于 2013-05-02T20:15:31.190 回答
-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 );

或更好 - 重新设计您的表格,使其结构合理。:)

于 2013-05-02T20:05:28.930 回答