我有以下三个表格表示树结构。 #A
中的每一行都是#B
中零行或更多行的祖先。同样,#B
中的每一行都是#C
中零行或更多行的祖先。表#B
包含一列value
。我需要为属于输入祖先的#B
中的所有行找到value
的总和。总结查询结果的不同元素
例如,考虑表的内容如下:
CREATE TABLE #A (id varchar(10));
CREATE TABLE #B (id varchar(10), value int);
CREATE TABLE #C (id varchar(10), a_id varchar(10), b_id varchar(10));
INSERT INTO #A(id) VALUES ('A1'), ('A2');
INSERT INTO #B(id, value) VALUES('B1', 41), ('B2', 43), ('B3', 47);
INSERT INTO #C(id, a_id, b_id) VALUES('C1', 'A1', 'B1'), ('C2', 'A1', 'B1'),
('C3', 'A1', 'B2'), ('C4', 'A2', 'B3');
以上内容表示如下结构:
A1
|--- B1 (41)
| |-------- C1
| |-------- C2
|
|--- B2 (43)
|-------- C3
A2
|--- B3 (47)
|-------- C4
的父 - 子关系被古怪定义。表#B
没有自己的列表,表#A
中的哪一行是它的祖先。所有映射都应根据表#C
进行评估。列表a_id
和b_id
分别在表#C
中指定祖父母行和父行分别在表#A
和#B
中。如果有一排Z
在#C
其中a_id
是X
和b_id
是Y
,然后X
是Y
和Y
祖先是Z
祖先。在#C
中不会有冲突的映射。
问题陈述:对于给定的ID A1
,发现value
列的所有行中#B
,其父母为A1
的总和。这里有两个孩子A1
,B1
其值为41
和B2
的值为43
所以我们期望答案是84
。
如果我这样做如下:
SELECT SUM(#B.value) FROM #B
INNER JOIN #C ON #B.id = #C.b_id
INNER JOIN #A ON #C.a_id = #A.id
WHERE #A.id = 'A1'
我得到125
即41 + 41 + 43
代替84
,因为在#A
两行具有映射B1 -> C1
。我可以写下面的查询来获取与#B
中的不同行相关联的值,即41
和43
,但是现在我不知道如何对结果值进行求和。我能否在不创建临时表的情况下获得预期结果?
SELECT MAX(#B.value) FROM #B
INNER JOIN #C ON #B.id = #C.b_id
INNER JOIN #A ON #C.a_id = #A.id
WHERE #A.id = 'A1'
GROUP BY #B.id;
我不是SQL专家,所以可能会有一个非常简单的解决方案。
这是最简单的解决方案。正如你所说的,表格#A不是必需的。还有一点要记住:当我们需要删除重复项时,INNER JOIN'不能替代WHERE-IN子句。 – 2014-09-29 13:55:51