【发布时间】:2016-08-04 22:07:02
【问题描述】:
我创建了一个 Oracle SQL 查询,它链接到我在 Oracle FROM 子句中使用到 Oracle 表单的大约五个表,但查询的问题是某些记录重复,所以我只想显示一个表格中的行,而不是任何重复的记录。我已经尝试过 GROUP BY 和 PARTITION BY 语句,但是将其添加到语句中后查询会变慢。
我现在正在考虑将其作为一个程序进行,如果出现任何重复项,则只带回其中一个。最好将数据库中的 ORACLE 记录表带回表单中吗?如何在 Oracle PL/SQL 循环中查找重复项最好?
我更新了问题并在下面添加了完整的查询以更好地解释它。下面选择语句中的第一列 surr_id 是唯一的,但我想在 Oracle 表单中显示的是生产编号以及其他不唯一的列。生产编号可能有重复,甚至有时三个生产编号记录相同。希望这可以帮助。我想把它放在一个循环中,只获取第一个生产编号,然后只在生产编号发生变化时带回每条记录。
select x.surr_id ,
x.supplier_name as supplier ,
x.broadcaster_name as broadcaster ,
ptle.title as production_title ,
x.production_number as production_number ,
stle.title as series_title ,
x.production_source as supplied_source_ind ,
x.third_party_group_id ,
x.bro_broadcast_by_tp_surr_id ,
x.station_id from (select usage_headers.surr_id as surr_id ,
broad_supp.supplier_name as supplier_name ,
broad_supp.broadcaster_name as broadcaster_name ,
usage_headers.production_number as production_number ,
productions.production_source as production_source ,
broad_supp.station_id as station_id ,
usage_headers.prod_exploitation_cre_surr_id as prod_exploitation_cre_surr_id ,
usage_headers.bro_broadcast_by_tp_surr_id as bro_broadcast_by_tp_surr_id ,
productions.cre_surr_id as cre_surr_id ,
productions.prod_series_cre_surr_id as prod_series_cre_surr_id ,
broad_supp.third_party_group_id as third_party_group_id
from usage_headers, productions, (SELECT /*+ index (bro bro_pk) */
third_party.surr_id AS THIRD_PARTY_SURR_ID,
third_party.supplier_group_id AS THIRD_PARTY_GROUP_ID,
third_party.dn_root_tp_surr_id AS THIRD_PARTY_ROOT_ID,
third_party.supplier_name, bro.station_id AS STATION_ID,
bro.dn_tp_name AS BROADCASTER_NAME FROM ( SELECT tp.surr_id,
tp.name AS supplier_name,
tp.tp_surr_id AS supplier_group_id,
tp.dn_root_tp_surr_id FROM third_parties tp
CONNECT BY PRIOR tp.surr_id = tp.tp_surr_id
START WITH tp.surr_id IN (4251, 4247, 4237, 4034, 10157, 14362, 9834)) third_party
JOIN broadcasters bro ON (third_party.surr_id = bro.tp_surr_id)) broad_supp
where broad_supp.THIRD_PARTY_SURR_ID = usage_headers.bro_broadcast_by_tp_surr_id
AND usage_headers.prod_exploitation_cre_surr_id = productions.cre_surr_id
and usage_headers.prod_exploitation_cre_surr_id IS NOT NULL
and usage_headers.right_type in ('M','B')
AND usage_headers.udg_surr_id IS NOT NULL
AND NVL(usage_headers.dn_uls_usage_status,'3') NOT IN ('9', '11')
AND productions.production_source <> 'AP') x
LEFT OUTER JOIN titles ptle ON ( ptle.cre_surr_id = x.cre_surr_id AND ptle.tt_code = 'R')
LEFT OUTER JOIN titles stle ON ( stle.cre_surr_id = x.prod_series_cre_surr_id AND stle.tt_code = 'R')
提前感谢大家
【问题讨论】:
-
如果整个结果集行重复,您可以使用
distinct,但这可能表明您的查询或数据存在问题...如果某些列重复但其他列是唯一的,您会需要决定保留哪些,然后可能进行汇总;但你似乎已经尝试过了。分组不应该减慢太多,除非您当前只获取第一组行。 -
您需要修复查询,而不是用户界面。
-
嗨,伙计们,查询中的数据是唯一的,但我想带回表单中的不是,所以查询中的 select unique_id, prododuction, station 但我只想在表单中显示生产和工作站,但生产和工作站有时会重复。
-
那么为什么要在选择列表中包含您不会使用的列?如果你不需要它们,也许你不需要所有的连接,并且不会得到重复。虽然真的说得太模糊了。
标签: sql forms plsql oracle11g duplicates