【问题标题】:oracle sql return unmatched results only between two tablesoracle sql 仅在两个表之间返回不匹配的结果
【发布时间】:2021-06-04 20:30:37
【问题描述】:

我需要返回两个表之间的不匹配结果,其中两个表之间只有部分数据重叠,并且两个表上都没有主键。 oracle sql 数据库是 11ish 版本。所需的输出是将销售名称汇总为逗号分隔的字符串。我来自 teradata sql 知识(初学者)并在旧数据库上转换为 oracle sql 并遇到语法和支持的功能挑战。

Tables

我尝试过使用完全外连接,没有主键就无法工作,我尝试过 not in, !=, != ANY (string) 并且都没有产生输出。即使对于类似于表 1 的每个不匹配结果的输出是 1 条记录,我也可以使用 listagg 函数输入一个逗号分隔的字符串。

我已尝试搜索,但不确定最佳方法,有人有建议或建议吗?感谢您提供任何帮助。

【问题讨论】:

  • 请解释问题中的结果集的逻辑。不明显。

标签: sql oracle comparison


【解决方案1】:

你可以使用listagg():

select prop_id, sales_cde,
       listagg(sales_name, ',') within group (order by lvl)
from t
group by pop_id, sales_cde;

编辑:

哦,您似乎想要不会出现两次的代码。您可以使用以下方式获取代码:

select prop_id,
       max(max(sales_cd)) over (partition by pro_id) as sales_cd,
       sales_name, count(*) as cnt
from ((select prop_id, sales_name, sales_cde
       from table1
      ) union all
      (select prop_id, sales_name, null
       from table2
      ) 
     ) t12
group by prop_id, sales_name;

那么你想listagg()那些只出现一次的:

select prop_id, sales_cd,
       listagg(case when cnt = 1 then sales_name end, ',') within group (order by sales_name)
from (select prop_id,
             max(max(sales_cd)) over (partition by pro_id) as sales_cd,
             sales_name, count(*) as cnt
      from ((select prop_id, sales_name, sales_cde
             from table1
            ) union all
            (select prop_id, sales_name, null
             from table2
            ) 
           ) t12
      group by prop_id, sales_name
     ) t12
group by prop_id, sales_cde;

【讨论】:

  • 感谢您的回复,但还不够完整。 list agg 函数有助于聚合是的,但是在聚合最终结果之前,我需要额外的代码来首先提供不匹配的结果。例如,销售代码 'def123' 的道具 id '021' 的销售名称为 'ab' 、 'ef' 和 'to' ,在 5 个选项中总共有 3 个选项,但是它缺少值 'cd' 和'mr' - 我需要将这两个缺失值放在结果集中(然后首选放入聚合字符串)。无与伦比的结果是我无法解决的问题。想法?
  • @M.Reeves 。 . .我觉得我懂了。检查编辑。
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 2020-04-24
  • 2013-04-18
  • 2016-03-12
  • 2021-01-08
  • 1970-01-01
  • 2015-06-07
  • 2017-12-16
相关资源
最近更新 更多