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