将数据从登台表复制到多个表

时间:2016-04-23 16:47:55

标签: sql-server merge staging-table

在SQL Server 2016中,我有一个包含8列的临时表[S]。我想将这些数据复制到3个表[A],[B]和[C]。 [A] FK到[B],[B]有FK到[C]。第1-2栏将转到[c],第3栏至[a]和第4-8至[B]栏。

谁能告诉我怎么做到这一点?效率并不是最重要的,只有5.5Krows。

任何帮助都非常感激。

编辑:

应该更清楚:

  • 表a,b和c存在并且已经存在PK和FK。
  • c对col1和col2的连接具有唯一约束。
  • a,b和c使用IDENTITY PK
  • 要导入的数据已清除重复项。

2 个答案:

答案 0 :(得分:0)

你是否有效地将S中的一行分成3个表? 为什么不使用表S中的主键而不是"链接"你想用的钥匙?

您仍然可以按照自己的方式加入数据,您也可以在不使用B的情况下加入表A和C.

P.S。如果您没有S中的PK,或者您想要复制的形状,您仍然可以在一个表中使用代理键并从其他两个表中引用它。

这里是表C的解决方案,您可以为其他表调整它:

CREATE TABLE c (
    ID int PRIMARY KEY
  , col1 int
  , col2 int
)
INSERT INTO c(id,col1,col2)
SELECT
    ROW_NUMBER() OVER(ORDER BY s.PrimaryKey)
  , s.col1
  , s.col2
FROM s

INSERT INTO c(id,col1,col2)
SELECT
    s.PrimaryKey
  , s.col1
  , s.col2
FROM s

或(对我来说太隐晦了)

SELECT
    IDENTITY(int,1,1) AS ID
  , col1
  , col2
INTO c
FROM s
ORDER BY s.PrimaryKey

编辑: 如果您正在尝试摆脱冗余,那么您可以像这样使用DENSE_RANK()(为您需要的密钥添加/删除排名):

SELECT DISTINCT
    DENSE_RANK() OVER(ORDER BY col1) AS PK_a
  , s1.col1
INTO a
FROM s1

SELECT DISTINCT    
  DENSE_RANK() OVER(ORDER BY col2,col3) AS PK_b
  , DENSE_RANK() OVER(ORDER BY col1) AS FK_a
  , s1.col2
  , s1.col3
INTO b
FROM s1

SELECT DISTINCT
    DENSE_RANK() OVER(ORDER BY col4) AS PK_c
  , DENSE_RANK() OVER(ORDER BY col1) AS FK_a
  , DENSE_RANK() OVER(ORDER BY col2, col3) AS FK_b
  , col4
INTO c
FROM s1

答案 1 :(得分:0)

我最终使用了Entity Framework 6 BulkInsert工具。我发现使用我已定义的模型类更容易。我只是将所有对象从暂存中读取到一个暂存对象列表中,然后再迭代它们并构建a,b和c,最后将它们全部保存在一个调用中。在10secs下的5.5K行。

感谢您的帮助@Bistabil