Sql group by with very large join alternative

时间:2016-09-07 20:40:45

标签: sql sql-server

表1

Itemid   saleid
---------------
53355    23224
33544    33246
53355    33353
43324    33353

表2

Saleid  Rebate
--------------
23224    3000
33246    5000
33353    5555
33353    4444

这是一张简化的表格。我的问题是我想首先按itemid分组,然后加入table2 saleid。如果我通过saleid单独执行该组,它返回100,000行数据,这很好,但如果我也按照saleid分组加入它,我会得到数百万行,这对我来说是不可行的。任何想法如何使我的工作,所以我可以连接这些表?

所以请记住,itemid有很多我可以分组的项目但是saleid不是唯一的,所以想在小组之后连接这个

这是一个简单的查询,例如,我可以获得数百万行。如果它在group by之后加入if仍然应该是100,000行数据。

select 
    ta.itemid, ta.saleid, sa.itemid
from 
    table1 ta
inner join 
    saleid sa 
where 
    ta.saleitemid = sa.itemid
group by 
    itemid, saleid

2 个答案:

答案 0 :(得分:0)

如果您使用子查询,然后将该查询加入表2,则可以先执行该组:

SELECT *
FROM
(SELECT itemid, saleid
FROM Table_1
GROUP BY itemid, saleid) sub
INNER JOIN Table_2
ON sub.saleid = Table_2.saleid

编辑:上述查询根据您的评论不适合您,因此我会尝试提出一个问题,让我们了解您真正想要的内容。

假设这是表1:

Itemid   saleid
20000    23224
33544    33246
53355    22523
43324    33353
43324    11111
43324    22222
43324    33333
43324    44444

这是表2:

Saleid  Rebate
23224    3000
33246    5000
22523    5555
33353    4444
11111    1111 
22222    2222 
33333    3333
44444    4444

在评论中告诉我们您所需的输出结果。

附加更新:此项显示每个项目ID的总和(回扣):

SELECT itemid, SUM(rebate)
FROM t1 INNER JOIN t2
ON t1.saleid = t2.saleid
GROUP BY itemid

答案 1 :(得分:0)

虽然Group By可以允许您减少查询返回的记录数,但它通常用于聚合(count(),sum(),min(),max()等)。无论添加到Group By子句中的任何内容都会影响返回的记录数,因为您通过更具体的方式创建组,从而降低了将行组合在一起的能力。

听起来你的ItemId表和SalesId表之间有一对多的关系。因此,如果您只是通过ItemId从Item表和组中进行选择,则这是一个更通用的分组,并将记录数减少到表中唯一的ItemIds。如果您在组中包含SalesId,现在您只按ItemId和SalesId的唯一组合进行分组,这将产生更多记录。

如果您将SalesId表加入此查询中,此时无关紧要,只要两者都包含在Group By中,您将始终获得唯一ItemIds和SalesIds的数量。

也许尝试通过提供有关您查询的数据的更多细节来重申您尝试获得的结果,我们可以帮助您编写更加性能友好的选择......