SQL连接没有重复的父行

时间:2012-03-17 17:23:03

标签: sql join

我在一个x到多个ys的SQL服务器数据库中有一对多的关系。

当我加入这两个表时,我会得到如下数据:

1x 1x 1y 1y
1x 1x 2y 2y

我得到x数据两次,因为有两个子行与之关联。

问题是我需要对两个表中的列运行求和,并且在每种情况下我只想对每个唯一行列求和一次。因此我想要数据:

1x   1x   1y 1y
null null 2y 2y

我知道这可以很容易地使用子查询完成,但需要考虑性能因素。

感谢。

编辑 -

因为每个人都想要一个更具体的例子:

有一个非常大的订单表放在某种商店。 这些订单可以有折扣。折扣可以应用于多个订单。 每个订单在顶级都有税,运费和折扣总列。 每个订单都有一个子订单项的集合。这些订单商品包含商品价格和销售数量。

对于每个折扣,我想要总销售额。 这将是每个订单与折扣税的总和+每个订单的总和与每个折扣发货+每个订单的总和订单项目价格*数量 - 折扣总额的总和。

所以我有两个需要总结的关卡。订单上的订单和订单商品上的订单。

无法修改表格。

我已经使用子查询得到了正确的数字,但我还必须对求和列进行排序,我发现它非常慢。

我的当前模型组按折扣应用并加入订单和订单商品。它非常有效,但会返回包含多个子项的订单列的重复项。

2 个答案:

答案 0 :(得分:3)

如果子查询可以返回所需的结果,则应该使用它。

它总是取决于您的数据库结构和要求。子查询并不总是需要增加开销。

答案 1 :(得分:1)

简单地说,您想要计算每个订单的总成本,然后将按折扣分组的所有订单的总成本相加。

with orderTotals as (
select discountID,
       min(tax + shipping - discount) + sum(price * quantity) as total
  from orders
  join items on orders.orderID = items.orderID
 group by discountID, orders.orderID
)
select discountID,
       sum(total) as total
  from orderTotals
 group by discountID
;

您可以将max()或avg()替换为min()并仍然得到相同的结果,因为税,运费和折扣是给定订单的常量。