在 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
)
我得到了笛卡尔积,但找不到阻止它的方法...
我试图将我的查询简化到严格的最低限度:
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
)