在 sql 查询中避免笛卡尔积

Avoiding Cartesian product on sql query

我得到了笛卡尔积,但找不到阻止它的方法...

我试图将我的查询简化到严格的最低限度:

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

这里的问题是 tableB 有 3 个结果行,因此总金额被添加了 3 次(tableB 的结果的原因)。我不知道如何指定我只想要 tableB 的最后结果,我想这会解决问题。

table一个:id |金额

table乙: 编号 |日期 |评论

编辑:我发表了评论,但可能已将其添加到原始 post:我的查询中需要 tableB(无法删除)以及返回的每一行之间的差异这个 tableB 是日期列

你不是真的在做笛卡尔积。或者,你是,但每个 table 有一行。性能不是问题。

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

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;

这强调您正在做笛卡尔积,但大概每个 table.

中只有一行

您可以将计算简化为:

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

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

我有这个

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
                   )