【问题标题】:Full outer join is resulting in Cartesian product when counting records in Cognos在 Cognos 中计算记录时,完全外连接会导致笛卡尔积
【发布时间】:2015-10-07 20:24:30
【问题描述】:

我正在 Cognos 报表工作室的“id”列上的 2 个表 A 和 B 上执行完全外部联接。两个表都有 id 列的多条记录。我的要求是我必须计算每个表中的记录数并将其显示在图表上。但是当我计算记录时,它会乘以记录并产生笛卡尔积。

A.id ----   B.id  
1 ------ 1  
2 ------ 2  
2 ------ 2  
3 ------ 4  
4 ------ 5  
5 ------ 6

当我数数时,我得到的是:

A.id ----   B.id ----  Count(A.id)----   Count(B.id)  
1  ----     1   ----     1    ----       1  
2 ----      2  ----      4  ----         4    (Am expecting 2 for these kind of records)  
3  ----      null ---- 1 ---- null  
4 ----      4 ----       1----           1          
5 ----      5  ----      1 ----          1   
null ----        6 ----  null  ----               1  

我需要在图表中显示表 A 和表 B 中的记录总数。由于这会导致叉积,因此图形值没有给出正确的结果。任何人都可以建议如何在第二条记录中避免这种笛卡尔积吗?请建议这是否可能?

【问题讨论】:

  • 你能澄清一下问题吗?第二张表代表什么?那是来自联接的派生查询吗?是否为查询启用了自动分组和汇总?
  • 感谢约翰调查此事。自动分组和汇总设置为自动。第二张表是加入后的结果。加入后,我正在计算每个表中的记录。如果表 A 中有 2 条 id 相同的记录,表 B 中有 4 条 id 相同的记录,则连接后得到 8 条记录,这意味着它正在执行笛卡尔积。我应该将表 A 计为 2,将表 B 计为 4。这是因为我有重复项并且查询中没有唯一列吗?
  • 您是否收到有关交叉产品的警告?您是否定义了 2 个查询主题之间的连接?
  • 安德鲁,我没有收到任何关于交叉产品的警告消息。只是输出不正确。是的,我已将查询主题之间的完全外连接定义为 0-n 和 0-n。

标签: cognos cartesian-product full-outer-join


【解决方案1】:

如果必须单独显示计数,则使用两个表的 Union 并分别计数 id。

【讨论】:

    【解决方案2】:

    由于您要加入非唯一列,因此左侧特定值的每个实例都会与右侧该值的每个实例匹配。

    想象一下,如果表 A 是这样的:

    ...和表 B 看起来像这样:

    两个表在 ID 上的完全外连接会导致:

    必须表示所有组合。这就是为什么每次计数显示 4 的原因。在自动分组和汇总之前有四行结果。

    添加到从连接派生的查询的聚合只能在连接发生后对结果行进行计算。在某种程度上,单个查询的详细信息是模糊的,因此无法计算等。

    如果您在这样的连接上生成 SQL,您会经常看到 Cognos 已经这样做了:

    SELECT a.column1, a.column2, b.column1. b.column2 
    FROM (
        SELECT column1, column2 
        FROM tableA
        ) a FULL OUTER JOIN
        (
        SELECT column1, column2
        FROM tableB
        ) b ON a.column1 = b.column1
    

    更高级别查询中的计数将被添加到外部选择中,但外部选择无法知道有多少行来自 A,有多少来自 B。它只能计算连接的结果行.

    我能想到的唯一解决方案是在单个查询级别进行计数,然后将它们拉到连接查询中。

    【讨论】:

      猜你喜欢
      • 2013-01-20
      • 2021-11-19
      • 2011-03-24
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多