0

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

Table  Column   Column

one    abc

two    abc      cde

three  cde      def

four   def      dt

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

我试图从表一中获取所有数据,其中 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')
                                         )
                           )
              );

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

4

2 回答 2

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');
于 2013-11-01T00:46:07.473 回答
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')
);
于 2013-11-01T00:56:58.547 回答