我在一个带有复合主键的表中有一组数据,但是键中第二列的原因对于我们的用途而言非常虚假,我需要将表转换为具有单列主键的表和一个主要属性,带有一些额外的可选属性字段来代替以前的虚假行,以防它们需要引用。这是一个例子:
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千行可以列出其他属性的行。我知道这种非规范化并不总是令人满意的,但对于我们现在的情况,它会非常有用。