我有两张表格如下:
表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种不同的组合,查询需要很长时间才能执行。
请提供更快捷的方法。
答案 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')然后你会得到每个重复实例的结果。