【问题标题】:Multiple Table Join, inner join vs Exists多表连接,内连接与存在
【发布时间】:2013-10-31 23:53:14
【问题描述】:

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

Table  Column   Column

one    abc

two    abc      cde

three  cde      def

four   def      dt

现在表 4 中的 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')
                                         )
                           )
              );

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

【问题讨论】:

  • 您能否提供实际的表结构以及哪些列是相关/外键?您拥有的内连接听起来是正确的,但您可能只需将其更改为左连接或右连接。你最好也提供这个。
  • 我做了一些修改,有帮助吗?

标签: sql oracle join exists


【解决方案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');

【讨论】:

  • 这正是我使用内连接所做的。在某些情况下,我有这些不唯一的列。说在表二中,列 abc 中有多个具有相同值的行。
  • 啊。在这种情况下,它会给出重复的结果是可以理解的。为了解决这个问题,我认为您可以使用 distinct 或 GROUP BY 获得比您正在执行的查询更好的性能。
  • 我尝试了 distinct,它增加了很多成本,你能展示如何使用 GROUP BY 来做到这一点吗?
  • 只需按表一中的所有列添加组。
【解决方案2】:

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

【讨论】:

  • 嘿看起来是个好主意,我明天试试这个并更新你。
猜你喜欢
  • 2019-01-29
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多