我有两个关系(SQL数据库中的表),只有纯数字。这两种关系可以想象为矩阵。
问题是编写一个SQL查询,将两个关系相乘,就像我们使用普通矩阵乘法一样。
我一直绞尽脑汁......但是没有用:O
任何人都可以帮我解决?????
表编号1:
@ Aaron Bertrand:
我正在使用SQL Server 2008 R2 表格的截图是:
表1:
表2:
我使用了查询:
select t1.A,t2.B,SUM(t1.C*t2.C)
from Table_1 as t1 join Table_2 as t2 on t1.B=t2.A
group by t1.A,t2.B
order by t1.A
答案:
这种方式非常简单,而不是@Marcelo Cantos和@ypercube建议的原始Matrix方式...
答案 0 :(得分:14)
假设以下结构:
A (row INT, col INT, value FLOAT)
B (row INT, col INT, value FLOAT)
你可以这样写:
SELECT A.row, B.col, SUM(A.value * B.value)
FROM A JOIN B ON A.col = B.row
GROUP BY A.row, B.col
编辑:使用表格的表格布局来模仿矩阵结构会使这个问题变得更加困难,至少有两个原因:
最好的解决方法是在每个表中添加一个行号列...
table1 (row, A, B, C)
table2 (row, A, B, C)
...然后将我建议的结构合成为每张桌子上的一个视图......
CREATE VIEW A
SELECT row, 1, A FROM table1 UNION
SELECT row, 2, B FROM table1 UNION
SELECT row, 3, C FROM table1 UNION
-- Ditto VIEW B
...最后使用上面的SQL来评估答案。如有必要,您可以编写另一个视图,将结果转换回表格结构。
然而,坦率地说,我认为所有这些都是非常错误的。使用行/列/值结构(并且逻辑上更一致)比A / B / C / ...结构更好。例如,考虑使用row / col / value计算矩阵转置的容易程度:SELECT col AS row, row AS col, value
FROM A
或总和对角线:
SELECT SUM(value)
FROM A
WHERE row = col
并问自己这些结构使用起来有多容易。
PS:关于逻辑连贯性的主题,你的表不是正确意义上的关系,因为它们在行上定义了一个顺序,并且必须允许重复的行,这两个行都没有关系,(松散地)定义为一组元组。如今,n维关系与二维表的这种混淆是数据管理不善的核心。答案 1 :(得分:3)
我假设两个表都有(i, j, dataij)
列
其中i
表示row
,j
表示column
:
SELECT a.i
, b.j
, SUM(a.dataij * b.dataij)
FROM table1 AS a
JOIN table2 AS b
ON a.j = b.i
GROUP BY a.i
, b.j
使用这种数据结构,像乘法这样的矩阵之间的操作更容易。更难的是以通常的矩阵格式显示表格。一种方法是使用这样的东西(检查PIVOT,如果你有一个支持它的SQL-Server版本以实现它的其他方法):
SELECT
MIN(CASE WHEN j=1 THEN dataij ELSE NULL END) AS column1
, MIN(CASE WHEN j=2 THEN dataij ELSE NULL END) AS column2
, MIN(CASE WHEN j=3 THEN dataij ELSE NULL END) AS column3
FROM tableX
GROUP BY i
ORDER BY i
;