1

我有一个如下表:

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
) 

我确信有更好的方法可以用更少的代码行来实现相同的输出。

4

2 回答 2

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已经提供了不同的结果。

于 2012-06-14T17:12:08.377 回答
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
于 2012-06-13T21:33:29.803 回答