Sql 多表联接,内部联接vs存在

Sql 多表联接,内部联接vs存在,sql,oracle,join,exists,Sql,Oracle,Join,Exists,我在获取任务的正确查询时遇到问题。假设我们有4个表,其中包含以下列 Table Column Column one abc two abc cde three cde def four def dt 现在,表4中的dt列是一个日期数据类型 我试图从表1中获取所有数据,其中dt中的日期大于2012/01/01。列abc、cde和def是相关的 我正在做这样的事情: Select * from one t where Exists

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

Table  Column   Column

one    abc

two    abc      cde

three  cde      def

four   def      dt
现在,表4中的dt列是一个日期数据类型

我试图从表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')
                                         )
                           )
              );

我使用内部联接尝试了同样的方法,但是内部联接给出的行数实际上比表在某些情况下的行数要多。基本上是复制行。非常感谢您的帮助。我也看了distinct,看起来它增加了成本。

可以这样做。看不到您是如何为您提供比表计数更多的行的:

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');

补充Felipe Silva的答案,你可以把。。在外层的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')
);

请提供实际的表结构以及哪些列是相关的/外键?您拥有的内部联接听起来正确,但您可能只需要将其更改为左联接或右联接。这对你来说也很好。我做了一些更改,有帮助吗?这正是我使用内部连接所做的。在某些情况下,这些列不是唯一的。假设在表2中,abc.Ah列中有多行具有相同的值。在这种情况下,它会产生重复的结果是可以理解的。为了解决这个问题,我认为使用distinct或GROUP BY可以获得比使用您正在执行的查询更好的性能。我尝试了distinct,这会增加很多成本,您能演示如何使用GROUP BY吗?只需将GROUP BY的所有列添加到表1中。嘿,这看起来是个不错的主意,我明天将尝试并更新您。