1

私は以下のようなテーブルを持っています:

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

要件は、すべてのフィールド(IDを除く)を1つに結合して、テーブルが次のようになるようにすることです。

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

値は明確である必要がありますが、どのような順序でも問題ありません。これは、Field1からField3が(任意の一時テーブルの)1つの列であり、異なる値を持つ必要があることを意味します。結果を明確にするために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 に答える