【发布时间】:2013-02-26 22:54:34
【问题描述】:
假设我们在 DB 中有以下表格:
CREATE TABLE #nodes(reporter varchar(10), groupname varchar(10), node varchar(20))
CREATE TABLE #nodes_extract(id int IDENTITY, min_node varchar(20), count_nodes int, descr varchar(10) );
CREATE TABLE #nodes_histo(reporter varchar(10), groupname varchar(10), node varchar(20), nodes_extract_id int)
数据示例:
INSERT INTO #nodes (reporter, groupname, node) VALUES ('rep1','group1','node1')
INSERT INTO #nodes (reporter, groupname, node) VALUES ('rep1','group1','node2')
INSERT INTO #nodes (reporter, groupname, node) VALUES ('rep1','group2','node3')
INSERT INTO #nodes (reporter, groupname, node) VALUES ('rep2','group1','node1')
INSERT INTO #nodes (reporter, groupname, node) VALUES ('rep2','group1','node4')
INSERT INTO #nodes (reporter, groupname, node) VALUES ('rep2','group2','node5')
INSERT INTO #nodes (reporter, groupname, node) VALUES ('rep3','group1','node5')
INSERT INTO #nodes (reporter, groupname, node) VALUES ('rep3','group1','node6')
INSERT INTO #nodes (reporter, groupname, node) VALUES ('rep3','group2','node7')
让我们提取一些数据到#nodes_extract
INSERT INTO #nodes_extract
SELECT min(node), count(node), 'blabla'
FROM #nodes
GROUP BY reporter, groupname
现在我想将#nodes 中的所有信息插入#nodes_histo 并添加nodes_extract_id #nodes_histo 中的预期结果:
记者组名节点节点提取ID 代表 1 组 1 节点 1 1 代表 1 组 1 节点 2 1 代表 1 组 2 节点 3 4 代表 2 组 1 节点 1 2 代表 2 组 1 节点 4 2 代表 2 组 2 节点 5 5 代表 3 组 1 节点 5 3 代表 3 组 1 节点 6 3 代表 3 组 2 节点 7 6您将如何实现目标? 是否可以不改变表结构?
非常感谢! 咖啡厅
【问题讨论】:
-
你能解释一下
nodes_extract_id这个数字是如何根据reporter、groupname和node的值来计算的吗? -
@MahmoudGamal:这只是提取表中的自动增量 ID..
-
OK,但是
#nodes_extract表中没有节点node2、node4和node6,因此它们没有自动增量ID。你想如何将它们的 id 插入到#nodes_histo表中?或者,为什么他们应该分别获得您在所需结果中显示的 ID1、2和3? -
好的,我会尝试用另一个例子来解释。假设表#nodes 包含一些问题。其中一些可以用相同的答案来回答。 Nodes_extract 表包含答案。它是根据#nodes 表中的关键字创建的,但我不想将关键字插入到#extract 表中。所以我只想指出具体的答案。
-
谢谢你,Mahmoud,我想我找到了解决方案.. 基本上错误是在没有
distinct的情况下插入值来提取表。所以我解决了这个问题,我的解决方案是:SELECT a.reporter, a.groupname,a.node, e.id FROM (SELECT reporter , groupname , node , min(node) OVER (PARTITION BY REPORTER, groupname) m , count(node) OVER (PARTITION BY REPORTER, groupname) c FROM #nodes) a LEFT JOIN #nodes_extract e ON a.m = e.min_node AND a.c = e.count_nodes这是解决方案link
标签: sql tsql sql-server-2005