我有一个如下所示的查询:
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。
谢谢, 汤姆
答案 0 :(得分:1)
这完全有效。
我和我的同事经常使用的人为例子是city_of_birth
和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
子句中多次引用同一个表。
答案 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 );
或更好 - 重做你的桌子,使其结构合理。 :)