【问题标题】:Oracle SQL not bringing back duplicates to an Oracle Form 10gOracle SQL 不会将重复项带回 Oracle Form 10g
【发布时间】: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


【解决方案1】:

如果您得到完全重复的记录,那么只需添加一个 DISTINCT 子句,这样您的 SELECT 就变为 SELECT DISTINCT 将确保只返回一条记录。如果即使一列不同,那么这也行不通。

【讨论】:

  • Distinct 增加了语句的成本,并且此 DISTINCT 会减慢查询速度,因为它必须对表进行全面扫描才能获取所有不同的值。
  • 在这种情况下,我们需要查看完整的语句,以便我们可以防止在更早的时候发生重复。
  • @ShaunKinnair - 添加distinct 不会强制进行全表扫描,但会添加排序/修剪操作;如果它明显变慢,如果你已经订购了结果,我会感到惊讶。如果你不是,那么它可能会慢一点,但似乎你目前只获取第一组行的可能性更大。
猜你喜欢
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多