【问题标题】:How to find out non unique records?如何找出非唯一记录?
【发布时间】:2013-07-14 14:57:09
【问题描述】:
SELECT TRD.PKG_ID||'_'||TRD_CONT_NBR||'_'||LEG.TRD_LEG_NBR||'_'|| TRD.TRD_ID||'_'||CF.CURR_CODE||'_'||cf.cflw_date||'_'||CF.CFLW_TYPE_CODE
 ||'_'||CF.CFLW_STATUS_CODE as Surrogate_key 
 , CF.EFF_DATE, TRD.PKG_ID, TRD_CONT_NBR, TRD.SRCE_TRD_ID
 , LEG.TRD_LEG_NBR, TRD.TRD_ID, LEG.TRD_LEG_ID
 , CF.CURR_CODE, cf.cflw_date, CF.TRD_CURR_CASH_FLOW_AMT
 , CF.INT_RATE, cf.INT_RATE, CF.CFLW_TYPE_CODE, CF.CFLW_TYPE_GRP_CODE
 , CF.CFLW_STATUS_CODE 
from edw.extv_t_dim_trd TRD
 , edw.extv_t_trade_leg LEG
 , edw.extv_fact_cash_flow CF
where TRD.SRCE_TRD_ID = CF.SRCE_TRD_ID
  and TRD.TRD_ID = CF.TRD_ID
  and CF.SRCE_TRD_ID = LEG.SRCE_TRD_ID
  and CF.TRD_LEG_ID = LEG.TRD_LEG_ID
  and TRD.SRCE_SYS_CODE = 'WSS'
  and cf.SRCE_SYS_CODE = 'WSS'
  and leg.SRCE_SYS_CODE = 'WSS'
  AND TRD.TRD_STATUS_CODE <> 'CANCELED'
  AND LEG.INSTM_TYPE_CODE NOT IN ('FX', 'FX-OPTION')
  AND TRD.TRD_ACTV_TO_DATE >= to_date('04/01/2013','mm/dd/yyyy')
  and TRd.TECH_TRD_FLAG = 'N'
  and cf.cflw_status_code = 'FINAL'
  and TRD.ACTV_FLAG = 'Y'
  and LEG.ACTV_FLAG = 'Y'
  and cf.actv_flag ='Y'

通过上述查询,如果在 Surrogate_key 中添加 distinct,我能够找出唯一值,但我的问题是查询的总记录是 300 万。有不同的 250 万,但我想找到不间断的唯一值的价值。 500万。那么我该如何实现呢?

在某些情况下,我们在表中没有主键,所以我用它来形成 Surrogate_key 。即使那也包含一些重复的值。未来如果我需要使用什么样的方法来避免这样的问题。

谢谢, 斯里尼

【问题讨论】:

  • 请正确格式化您的代码,并将查询减少到核心问题。谢谢。
  • Oracle 人应该学习 ANSI SQL 来做连接。当在那里完成接缝时,where 子句是一团糟。
  • @srini 你喜欢找什么? Surrogate_key 的重复项?因为如果那样的话,也许我可以帮助你。
  • @GastonF。正是我想找到其余的重复记录

标签: sql oracle10g


【解决方案1】:

我不明白你所有的问题,但假设你想搜索 surrogate_key 的重复项,那么这个脚本可能会有用:

CREATE TABLE TEST(
  Surrogate_key VARCHAR2(100));

INSERT INTO TEST VALUES('AAAA');
INSERT INTO TEST VALUES('ACAA');
INSERT INTO TEST VALUES('AAAA');
INSERT INTO TEST VALUES('AAAB');
INSERT INTO TEST VALUES('AAAA');
INSERT INTO TEST VALUES('ACAA');

/*HERE THE QUERY*/
SELECT T.Surrogate_key, COUNT(1) AS MATCHES
FROM TEST T
GROUP BY T.Surrogate_key
HAVING COUNT(1) > 1 

你可以试试这个here

(2013-07-15 编辑) 假设你的查询有效,那么试试这个(这样你可以找到重复的行):

SELECT T.Surrogate_key, COUNT(1) AS MATCHES 
FROM (
    SELECT TRD.PKG_ID||'_'||TRD_CONT_NBR||'_'||LEG.TRD_LEG_NBR||'_'|| TRD.TRD_ID||'_'||CF.CURR_CODE||'_'||cf.cflw_date||'_'||CF.CFLW_TYPE_CODE
     ||'_'||CF.CFLW_STATUS_CODE as Surrogate_key
    from edw.extv_t_dim_trd TRD
     , edw.extv_t_trade_leg LEG
     , edw.extv_fact_cash_flow CF
    where TRD.SRCE_TRD_ID = CF.SRCE_TRD_ID
      and TRD.TRD_ID = CF.TRD_ID
      and CF.SRCE_TRD_ID = LEG.SRCE_TRD_ID
      and CF.TRD_LEG_ID = LEG.TRD_LEG_ID
      and TRD.SRCE_SYS_CODE = 'WSS'
      and cf.SRCE_SYS_CODE = 'WSS'
      and leg.SRCE_SYS_CODE = 'WSS'
      AND TRD.TRD_STATUS_CODE <> 'CANCELED'
      AND LEG.INSTM_TYPE_CODE NOT IN ('FX', 'FX-OPTION')
      AND TRD.TRD_ACTV_TO_DATE >= to_date('04/01/2013','mm/dd/yyyy')
      and TRd.TECH_TRD_FLAG = 'N'
      and cf.cflw_status_code = 'FINAL'
      and TRD.ACTV_FLAG = 'Y'
      and LEG.ACTV_FLAG = 'Y'
      and cf.actv_flag ='Y'
) T
GROUP BY T.Surrogate_key
HAVING COUNT(1) > 1

【讨论】:

  • 我不允许创建表。我进入 ETL 测试
  • @SriniVasan 那么如果您无法创建表,请尝试我发布的新查询可能会有用。
  • @SriniVasan 请不要忘记将此帖子标记为有用。谢谢!。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多