如此有效地,您将 S 中的一行分成 3 个表?为什么不使用表 S 中的主键而不是要使用的“链式”键?
你仍然可以按照你想要的方式加入数据,你也可以在不使用 B 的情况下加入表 A 和 C。
ps 如果你在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