查询:
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有一个2个关系。有可能对于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视图的一部分。
提前致谢。
答案 0 :(得分:1)
尝试使用ROW_NUMBER()
:
SELECT * FROM (
Select table_c.id_number, table_c.name, table_s.site_name,table_co.Contract_name ,
ROW_NUMBER() OVER(PARTITION BY table_c.id_number,table_c.name ORDER BY 1) as rnk
FROM table_c
INNER JOIN table_s ON(table_s.objid = table_c.sobjid)
LEFT OUTER JOIN table_m ON(table_m.cobjid = table_c.objid )
LEFT OUTER JOIN table_o ON(table_o.objid = table_m.olobjid)
LEFT OUTER JOIN table_a ON(table_a.objid = table_o.aobjid )
LEFT OUTER JOIN table_con ON(table_co.objid = table_a.conobjid))
WHERE rnk = 1;
注意:请避免使用隐式连接语法(以逗号分隔)并使用正确的连接语法。
我使用PARTITION BY table_c.id_number,table_c.name
,添加所有列,指定一个' unique'行。