2012-06-13 32 views
1

我有一個表像下面:合併多列到一個SQL Server 2005中

Table A 
---------- 
ID Field1 Field2 Field3 
1  A  NULL B 
2  B  NULL NULL 
3  C  A  NULL 
4  A  D  NULL 

的要求是所有字段(除ID)合併成一個,使表看起來像如下:

Table A 
------- 
ID Field 
1  A 
2  B  
3  C 
4  D 

任何順序都可以,但值必須是不同的。這意味着Field1到Field3需要是一列(在任何臨時表中)並且具有不同的值。我只是使用ID列來澄清結果,但ID不是必需的。目前,我正在使用聯合來獲得所需的輸出

select distinct Field 
from 
(Select Field1 as Field from TableA 
where Field1 is not null 
union 
Select Field2 from TableA 
where Field2 is not null 
union 
Select Field3 from TableA 
where Field3 is not null 
) 

我敢肯定有更好的代碼少線實現相同的輸出方式。

+3

爲什麼'ID 1 = A'?爲什麼'ID 3 = C'?爲什麼'ID 4 = D'? –

+5

你需要更好地解釋你的規則。爲什麼D和C勝出A,但A勝過B?這是岩石剪刀蜥蜴spock的新變種嗎? –

+0

3列中的唯一值?如果是的話,他們被分配的ID是什麼? –

回答

2

我認爲您的UNION解決方案是儘可能接近你想要的。我想,雖然清理了一下,像這樣:

SELECT Field FROM (
    SELECT Field1 AS Field FROM TableA UNION 
    SELECT Field2   FROM TableA UNION 
    SELECT Field3   FROM TableA 
) a 
WHERE Field IS NOT NULL; 

我由WHERE條款移到外面收緊的子查詢。另外,外部不需要DISTINCT,因爲UNION已經提供了明顯的結果。

+0

** a **代表什麼? –

+0

@Shaharyar,子查詢別名,根據需要。 –

0

我更新了我原來用過的東西。它似乎能夠爲您提供您提供的測試數據。

Create Table #temp 
(
ID Int, 
Field varchar(100) 
) 

Create Table #a 
(
ID Int, 
Field1 varchar(5) Null, 
Field2 varchar(5) Null, 
Field3 varchar(5) Null 
) 

Insert Into #a Values (1, 'A', null, 'B') 
Insert Into #a Values (1, 'B', null, null) 
Insert Into #a Values (1, 'C', 'A', null) 
Insert Into #a Values (1, 'A', 'D', null) 

Select * From #a 

Insert Into #temp 
Select ID, 
    Field = 
    (
     Case When Field1 IS NOT NULL Then Field1 + ' ' Else '' End + 
     Case When Field2 IS NOT NULL Then Field2 + ' ' Else '' End + 
     Case When Field3 IS NOT NULL Then Field3 + ' ' Else '' End 
    ) 
From #a 

Select * From #temp 

--Rename your new consolidated table to the real table name that you want 

Drop Table #a 
Drop Table #temp 
+0

嗨甘德斯,這不是我要找的。 –

+0

@GargiNarain你能告訴我我錯了什麼,如果你還需要幫助,我會解決的。 – ganders

+1

Ganders,你實際上連接了我在一列中尋找不同值的列。 –