在sql查询上避免笛卡尔积

时间:2018-01-24 16:48:48

标签: sql cartesian-product

我买了笛卡尔产品,却找不到防止它的方法......

我尝试将查询简化为严格的最低要求:

select
    SUM(tableA.amount) as "Total Amount"
from
    tableA,
    tableB,
where
    tableA.id= 12 and
    tableB.id= 10

这里的问题是tableB有3个结果行,所以总量增加了3倍(因为tableB的结果)。我无法弄清楚如何指定我只想要tableB的最后一个结果,我想这可以解决问题。

表A:id |量

表B: id |日期|评论

编辑:我评论过,但可能已将其添加到原始帖子上:我需要查询上的tableB(无法删除它),此tableB返回的每一行之间的差异是日期列

2 个答案:

答案 0 :(得分:0)

你并没有真正做笛卡尔积。或者,你是,但每张表中有一行。表现不是问题。

我可能倾向于将查询写成:

select SUM(a.amount) as Total_Amount
from (select a.* from tableA a where a.id = 12) a cross join
     (select b.* from tableB b where b.id = 10) b;

这强调你正在制作笛卡尔积,但可能只是每张桌子的一行。

您可以将计算简化为:

select SUM(a.amount)  as Total_Amount
from tableA a
where a.id = 12;

答案 1 :(得分:0)

根据我得到的帮助,我可能找到了解决问题的方法。请问这看起来不错吗?

我有这个

select
    SUM(tableA.amount) as "Total Amount"
from
    tableA,
    tableB,
where
    tableA.id= 12 and
    tableB.id= 10

我试过这个因为日期是tableB返回的行的唯一区别,这似乎有效......

select
        SUM(tableA.amount) as "Total Amount"
    from
        tableA,
        tableB,
    where
        tableA.id= 12 and
        tableB.id= 10 and
        not exists(select 
                      1 
                   from 
                      tableB b 
                   where 
                      b.date > tableB.date and 
                      b.id = tableB.id
                   )