【发布时间】:2016-06-26 11:26:13
【问题描述】:
查询:
Select table_c.id_number, table_c.name, table_s.site_name,table_co.Contract_name
FROM table_c , table_s, table_m, table_o, table_a, table_con
WHERE
table_s.objid = table_c.sobjid
AND table_m.cobjid (+) = table_c.objid
AND table_o.objid (+) = table_m.olobjid
AND table_a.objid (+) = table_o.aobjid
AND table_co.objid (+) = table_a.conobjid;
这里有 6 张桌子。 table_c 和 table_s 有一对一的关系。有可能对于 1 个 table_o 记录,我们可以有 2 个 table_c 记录或者可能没有记录。由于我需要在 SELECT 中获取 table_co 值以及 table_c 和 table_s 表,所以我在所有表 table_c->table_m- 上使用了左连接>table_o->table_a->table_co.
现在在运行这个查询时,它给了我重复的记录。我在 table_c 中有数百万条记录,所以如果我使用 distinct 或 Union ALL 删除重复记录,我的查询需要很长时间,这是不可接受的解决方案。
我能否以这样的方式更正此查询,以便它为我提供唯一记录而不会出现性能问题。
请注意,此查询是外部系统用来获取数据的 sql 视图的一部分。
提前致谢。
【问题讨论】:
-
请使用显式连接语法重写您的查询。
-
我同意 tim join 语法会使这更容易排除故障,因为您的关系不清楚。 w3schools.com/sql/sql_join_inner.asp 是一篇关于内连接的文章,以防万一这是一个较新的概念。我马上看到的一个问题是您没有为 table_s 与其他表定义任何关系,这意味着这将创建一个交叉连接并可能返回大量重复项,这可能也是为什么 distinct 或 group by 性能会很差的原因。
-
嗨@Matt/@Tim,我也同意使用显式连接(内/左外连接)并重新编写查询的建议。另一点,我不认为 table_s 可能是重复记录的原因,因为它与 table_c 具有 one2one 关系,并且 table_c 是此查询中的前导表。谢谢-