【问题标题】:Cartesian product SQL笛卡尔积 SQL
【发布时间】:2015-02-11 15:06:42
【问题描述】:

我已经搜索了其他问题,但我真的不知道如何获得正确的数量而不是笛卡尔积。

我有下表:

EGAIT6  EGACAM      EGVONO   ACC
2477717 -1443,87    41300015 2995
2477717 -2424,75    41300021 2995
2477717 -26630,16   41300022 2995
2477717   22652,96  41563318 2995
2477717   14513,12  41566334 2995
2477717   7703,08   41566335 2995
2477717   1443,87   41566336 2995
2477717   2482,70   41566338 2995
2477717   1124,84   41566339 2995
2477717   4610,99   41566337 2995
2477717    393,45   41571055 2995
2477717    393,45   41571056 2995
2477717    344,04   41574437 2995
2477717    344,04   41574438 2995
2477717    344,04   41584940 2995
2477717    344,04   41584941 2995
2477717    225,70   41689722 2995
2477717   1814,75   41726904 2995
2477717   1814,75   41726905 2995

这是我的查询:

select 
    a.egait6, 
    sum(a.egacam), 
    a.egvono, 
    max(a.egvtxt), 
    max(a.egacdt)
from m3prd.fgledg a
inner join m3prd.fgledg b
    on a.egait6 = b.egait6 
where a.egcono=001 
    and a.egdivi='012' 
    and a.egait1='2995' 
    and a.egait6='2477717'
group by a.egait6, a.egvono
having sum(a.egacam)<>0

我得到以下结果:

EGAIT6     EGACAM   EGVONO
2477717 6 880,80    41574437
2477717 49 654,00   41566338
2477717 6 880,80    41584940
2477717 290 262,40  41566334
2477717 36 295,00   41726905
2477717 92 219,80   41566337
2477717 -532 603,20 41300022
2477717 154 061,60  41566335
2477717 7 869,00    41571056
2477717 6 880,80    41574438
2477717 22 496,80   41566339
2477717 36 295,00   41726904
2477717 -48 495,00  41300021
2477717 4 514,00    41689722
2477717 453 059,20  41563318
2477717 6 880,80    41584941
2477717 -28 877,40  41300015
2477717 7 869,00    41571055
2477717 28 877,40   41566336

如何让我的查询根据我的表而不是笛卡尔积返回正确的金额?

正确的金额,金额的预期值为:

EGACAM
-  1 443,87
-  2 424,75
-  26 630,16
22 652,96
14 513,12
7 703,08
1 443,87
2 482,70
1 124,84
4 610,99
393,45
393,45
344,04
344,04
344,04
344,04
225,70
1 814,75
1 814,75

我正在创建一个自联接,因为我正在搜索的真实表在 EGAIT6 和 EGVONO 中都有更多不同的值。所以我不能删除查询的那部分。我只是想知道如何避免得到笛卡尔积。

【问题讨论】:

  • 您希望得到多少?
  • 究竟什么是“正确的金额”?您不仅从不明确地说出这一点,而且您的字段名称也很难推断出这一点。
  • 您正在将表连接到自身,使用“两个”表中的完全相同的字段。为什么不应该这样做?
  • 你正在对一个列进行自联接,该列的每一行只有相同的值,所以你当然会得到一个笛卡尔积。

标签: product cartesian


【解决方案1】:

删除这些行:

inner join m3prd.fgledg b
on a.egait6 = b.egait6 

我看不出在同一张表上进行连接有什么用......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2012-06-24
    相关资源
    最近更新 更多