【问题标题】:DB table extract and linking extracted data数据库表提取和链接提取的数据
【发布时间】: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这个数字是如何根据reportergroupnamenode的值来计算的吗?
  • @MahmoudGamal:这只是提取表中的自动增量 ID..
  • OK,但是#nodes_extract 表中没有节点node2node4node6,因此它们没有自动增量ID。你想如何将它们的 id 插入到#nodes_histo 表中?或者,为什么他们应该分别获得您在所需结果中显示的 ID 123
  • 好的,我会尝试用另一个例子来解释。假设表#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


【解决方案1】:

嗯,我想我找到了办法..

首先在插入命令中需要DISTINCT

INSERT INTO #nodes_extract
SELECT DISTINCT min(node), count(node), 'blabla'
FROM #nodes
GROUP BY reporter, groupname

通过以下选择,我可以提取我正在寻找的信息:

INSERT INTO #nodes_histo
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

【讨论】:

    【解决方案2】:

    不,您必须包含一种加入表格的方法,可能是通过在#nodes_extract 中包含reporter 和groupname。即使您尝试使用相同的查询(以及其他列)重新生成 #nodes_extract,也不能保证顺序相同。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多