将复合主键转换为具有多个属性列的单列键

时间:2015-03-30 09:55:19

标签: sql sql-server-2008-r2 pivot denormalization

我在一个带有复合主键的表中有一组数据,但是键中第二列的原因对于我们的用途而言非常虚假,我需要将表转换为具有单列主键的表和一个主要属性,带有一些额外的可选属性字段来代替以前的虚假行,以防它们需要引用。这是一个例子:

IF OBJECT_ID('tempdb..#Input') IS NOT NULL DROP TABLE #Input;
IF OBJECT_ID('tempdb..#Output') IS NOT NULL DROP TABLE #Output;

CREATE TABLE #Input
( Id    INT         NOT NULL
 ,Attribute NVARCHAR(1) NOT NULL
CONSTRAINT OriginalName PRIMARY KEY CLUSTERED (Id, Attribute));
CREATE TABLE #Output
( Id            INT         NOT NULL
 ,Attribute1    NVARCHAR(1) NOT NULL
 ,Attribute2    NVARCHAR(1)     NULL
 ,Attribute3    NVARCHAR(1)     NULL
CONSTRAINT hmmAnotherOriginalName PRIMARY KEY CLUSTERED (Id));

INSERT #Input(Id,Attribute)
    SELECT 1,1 UNION
    SELECT 2,2 UNION
    SELECT 2,3 UNION
    SELECT 2,1 UNION
    SELECT 3,3 UNION
    SELECT 4,5 UNION
    SELECT 4,1

INSERT #Output(Id,Attribute1,Attribute2,Attribute3)
    SELECT 1,   1,  NULL,   NULL    UNION
    SELECT 2,   1,  2,      3       UNION
    SELECT 3,   3,  NULL,   NULL    UNION
    SELECT 4,   1,  5,      NULL

SELECT * FROM #Input
SELECT * FROM #Output

DROP TABLE #Output
DROP TABLE #Input

我尝试了几个PIVOT,但我遇到的问题是虽然我知道有最大数量的属性(示例中为3),但我不知道属性的实际值是什么(在实际中)例如,它们实际上是州名的替代拼写)。到目前为止,所有具有动态列名称的东西都没有帮助我;由于状态名称可以出现在任何属性列中,所以它们都会有点混乱。

我尝试将我的输入分组到Id上,仅列出具有多个属性的那些,然后制作这些属性的动态列表并旋转它们,但同样,它又让我陷入了死胡同。

我实际上并不关心任何一个id的哪些可用属性被列为“主要”,不可为空的属性列,但坦率地说,我正试图找到一个解决方案;我非常感谢任何帮助!

顺便说一下,从大约200万行的表中列出了大约5千行可以列出其他属性的行。我知道这种非规范化并不总是令人满意的,但对于我们现在的情况,它会非常有用。

0 个答案:

没有答案