多表连接,内连接与存在

时间:2013-10-31 23:53:14

标签: sql oracle join exists

我遇到了为任务获取正确查询的问题。假设我们有4个表格,其中包含以下列

Table  Column   Column

one    abc

two    abc      cde

three  cde      def

four   def      dt

现在表4中的列dt是Date数据类型。

我正在尝试从表1中获取所有数据,其中dt中的日期大于2012/01/01。列abc,cde和def是相关的

我正在做这样的事情:

Select * 
from one t 
where Exists (Select a.abc 
              from two a 
              where a.abc = t.abc 
                and Exists (Select b.cde, b.def 
                            from three b 
                            where b.cde = a.cde 
                              and Exists (select c.def
                                          from four c 
                                          where c.def= b.def 
                                            abd c.dt >= toDate('2012-01-01', 'YYYY-MM-DD')
                                         )
                           )
              );

我使用内部连接尝试了同样的事情,但是内连接提供的行数实际上比表格在某些情况下更多。基本上它复制行。任何帮助深表感谢。我也看得很清楚,看起来它增加了成本。

2 个答案:

答案 0 :(得分:1)

这可以这样做。无法看到你是如何做到的,它给你的行数多于表数:

SELECT t1.*
FROM one t1
INNER JOIN two t2 ON t2.abc = t1.abc
INNER JOIN three t3 ON t3.cde = t2.cde
INNER JOIN four t4 ON t4.def = t3.def
WHERE t4.dt >= toDate('2012-01-01', 'YYYY-MM-DD');

答案 1 :(得分:1)

补充Felipe Silva的答案,你可以在外层放置where .. in语句来删除重复项

SELECT t1.*
FROM one t1 where t1.abc in (
  select t2.abc from two t2 
  INNER JOIN three t3 ON t3.cde = t2.cde
  INNER JOIN four t4 ON t4.def = t3.def
  WHERE t4.dt >= toDate('2012-01-01', 'YYYY-MM-DD')
);