组合计算的查询优化

时间:2015-11-25 13:25:03

标签: sql tsql

我有两张表格如下:

表1列出了不同的变量组合(非重复性):

 <section id="top">
    <div class="container topbg">
        <div class="row">
            <div class="col-lg-4-offset-lg-4 text-center">
                <div>
                <span class="thepeople" onclick="location='http://thepeople.com.au'">the people</span>
                <p><span class="agency" onclick="location='http://thepeople.com.au'">agency</span></p>
                </div>
            </div>
        </div>
    </div>
</section>

表2中Id(Say a person)的每个组合的得分:

name1   name2   name3
var1    var10   var11
var1    var10   var12
var1    var10   var13

上表有20个这样不同的ID分数组合,这两个表都有很多记录。

现在我希望通过使用第一个表变量字符组合来获得第二个表的ID的明显计数。

EG。

Id  name    score
1   var1    0
1   var10   0
1   var11   0
1   var12   0
1   var13   1
1   var14   0
1   var15   0
1   var16   1
1   var17   0
1   var18   0
1   var19   0
1   var2    0
1   var20   0
1   var3    0
1   var4    0

这样,如果任何一个组合在第二个表中得分= 1,则不同的ID计数会提供单独的组合得分。

我使用以下查询进行加入:

name1 name2 name3 name4 name5 name6 name7 name8 name9 name10 name11  Total Score
 var1 var10 var11 var12 var11 var3  var2  var7  var6  var11   var4    55
 var1 var10 var12 var13 var2  var2  var1  var8  var4  var20   var5    44
 var1 var10 var13 var14 var1  var1  var5  var9  var9  var6    var7    33

这样就完成了11种不同的组合,查询需要很长时间才能执行。

请提供更快捷的方法。

1 个答案:

答案 0 :(得分:1)

我不知道以下内容是否会使您的查询更快,但它至少会使它更清晰。当我继承某人的非规范化表时,我在这些情况下所做的是使用CTE对数据进行归一化以转换数据。至少它会使查询更易于维护,有时可以提高性能。

在这种情况下,我将table1转换为一个只有行id和名称的表。

WITH table1WithIds AS (
    SELECT ROW_NUMBER() OVER (ORDER BY name1, name2, name3) [RowId], name1, name2, name3
    FROM table1
)
, namesRelational AS (
    SELECT RowId, name1 [name] FROM table1WithIds
    UNION
    SELECT RowId, name2 [name] FROM table1WithIds
    UNION
    SELECT RowId, name3 [name] FROM table1WithIds
)
SELECT t1.name1, t1.name2, t1.name3, SUM(t2.score)
FROM namesRelational nr
INNER JOIN table2 t2 ON t2.name = nr.name
INNER JOIN table1WithIds t1 ON t1.RowId = nr.RowId
GROUP BY t1.name1, t1.name2, t1.name3

第一个cte,table1WithIds为每一行创建一个唯一的id。如果您已经在table1上有一个并且在示例中省略了,则可以跳过此步骤。如果你这样做,这也会提高查询的效率。

第二个cte,namesRelational,将table1转换为规范化的东西。

一旦有了转换后的表,查询本身就变得简单了。这种方法的一个警告是,如果table1具有相同的值但是顺序不同(即在一行中你有'var1','var2','var3'而在另一行'var3','var2','var1')然后你会得到每个重复实例的结果。