我遇到了为任务获取正确查询的问题。假设我们有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')
)
)
);
我使用内部连接尝试了同样的事情,但是内连接提供的行数实际上比表格在某些情况下更多。基本上它复制行。任何帮助深表感谢。我也看得很清楚,看起来它增加了成本。
答案 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')
);