【问题标题】:Merge temp table rows into table for each distinct ID将临时表行合并到每个不同 ID 的表中
【发布时间】:2017-02-24 07:04:51
【问题描述】:

我有一个标记输出(当前输出到一个临时表),我需要合并到另一个表中。每组标记都应作为最终表中每个不同 ID 的新行插入。

示例:
临时表:

标记

-----

ABC
ABB
ACC
等等(这个临时表中大约有 50,000 行。


身份证
ID        标记
---       ------

1         现有标记
1         ABC
1         ABB
1         ACC
1         等(所有 50k 标记)
2         现有标记
2         ABC
2         ABB
2         ACC
2         等(所有 50k 标记)
对表中的所有 ID 重复此操作。 150-5000 之间的任何地方。

 


【问题讨论】:

  • 您确定要为此创建一个新表,而不是使用 JOIN 语句的 SQL 查询吗?
  • 是的。这是操作数据的第一步。它最终会被进一步清理,然后发送到高性能分析引擎。

标签: sql-server-2008 merge temp-tables


【解决方案1】:

Across join应该这样做,它会产生临时表中标记集和id表中id集的笛卡尔积:

insert ID_Table (id, marker)
select distinct i.id, m.marker
from ID_Table i
cross join temp_table m
-- or use the statement below to filter out existing markers
-- cross join (
--   select marker 
--   from temp_table 
--   where marker not in (
--     select marker from id_table
--   )
-- ) m

这假定临时表中的新标记尚未在 id 表中 - 如果它们可能存在,您需要先过滤掉现有标记。

虽然请注意,将 50'000 行与 150-5'000 结合起来会创建很多行(在 7.5 到 2.5 亿之间)并且可能需要很长时间;但也许这就是你想要的?

【讨论】:

  • 感谢您的回复。 1. 是的,我们谈论的是数百万或行。 ID_Table 已经有近 700 万行(为您提供上下文)。 2. ID_Table 中不存在新标记。 3.由于我显然不精通这方面,如果我在解释或使用您的代码时出现错误,请见谅。但是,它所做的是为 ID_Table 中的每个现有 ID 添加一个空白标记。它应该将所有(在第一种情况下)5000 个标记添加到所有 140 个 ID。
  • 没关系。我在将您的陈述翻译成真实的列名时出错了。看起来效果很好。谢谢!
  • 谢谢。当然。我正在做一些进一步的验证并被跟踪。更新了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多