3

同じテーブルに次の 2 つの列があるとします。

Column 1
--------
1
2
3

Column 2
--------
4
5
6

私に与える結果を得るにはどうすればよいですか:

Columns
--------
1
2
3
4
5
6

編集

私が本当に探しているのは、同じテーブル内の複数の列に対してユニオンクエリを入力するより効率的な方法がないことを確認することです.

実際のクエリは次のようになります。

WITH T1 AS 
( SELECT [Col1] FROM [Table1] 
)
SELECT * FROM (
    SELECT [Cols1-100], COUNT(*) as "Count" FROM (

        SELECT [Col-1] FROM [Table2] AS [Cols1-100], [T1] 
        WHERE [Table2].[Col-1] = [T1].[Col-1] 
        AND [Col-1] != '2' AND [Col-2] != '2' ..... etc ..... AND [Col-100] != '2'
        UNION ALL

        SELECT [Col-2] FROM [Table2] AS [Cols1-100], [T1] 
        WHERE [Table2].[Col-1] = [T1].[Col-1] 
        AND [Col-1] != '2' AND [Col-2] != '2' ..... etc ..... AND [Col-100] != '2'
        UNION ALL

        ....................... etc
        ....................... etc
        ....................... etc
        .... etc

        SELECT [Col-100] FROM [Table2] AS [Cols1-100], [T1] 
        WHERE [Table2].[Col-1] = [T1].[Col-1] 
        AND [Col-1] != '2' AND [Col-2] != '2' ...... etc .... AND [Col-100] != '2'

    ) as [Temp1]
    GROUP BY [Cols1-100]    
) as [Temp2]

@Bohemian Outer Query を使用すると、次のことができますが、2 つのクエリをテストすると、かなり遅くなるようです。

WITH T1 AS 
( SELECT [Col1] FROM [Table1] 
)
SELECT * FROM (
    SELECT [Cols1-100], COUNT(*) as "Count" FROM (
            SELECT * FROM (
                SELECT [Col-1] AS [Cols1-100], [Col-1], [Col-2], ..etc.. [Col-100] FROM [Table2] 
                UNION ALL
                SELECT [Col-2] AS [Cols1-100], [Col-1], [Col-2], ..etc.. [Col-100] FROM [Table2] 
                UNION ALL
                ....................... etc
                .... etc
                SELECT [Col-100] AS [Cols1-100], [Col-1], [Col-2], ..... etc ..... [Col-100] FROM [Table2] 
            ) AS SUBQUERY WHERE [Col-1] IN (SELECT [Col1] FROM [T1])
            AND [Col-1] != '2' AND [Col-2] != '2' ..... etc ..... AND [Col-100] != '2' 
        ) as [Temp1]
    GROUP BY [Cols1-100]    
) as [Temp2]
4

3 に答える 3

11
select column1 as columns from mytable
union
select column2 from mytable

を使用unionすると、重複が削除されます (一部のデータベースでは並べ替えも行われます)。重複を保持
したい場合は、次を使用します。union all

select column1 as columns from mytable
union all
select column2 from mytable

編集:

where 句を追加するには、簡単ですが非効率的な実行方法は、それを外部クエリとして追加することです。

select * from (
    select column1 as columns from mytable
    union
    select column2 from mytable ) x
where columns ...

より効率的な実行方法ですが、非常に長いクエリは、各サブクエリに配置することです。

select column1 as columns from mytable
where ....
union
select column2 from mytable
where ...
于 2013-01-05T03:03:23.417 に答える
3

同じ where 句を複数回繰り返さなければならないためにユニオンを使用したくない場合は、[非常に悪い]回避策があります。

select decode(j.col, 1, column1, 2, column2)
from table t
join (select 1 as col from dual union select 2 from dual) j
 on 1 = 1
where (your where clause)

この例はオラクルのものです。SQLServer では、「デュアルから」は必要ありません。

また、結合する列がたくさんある場合 (実際には起こらないはずです)、「結合」内で階層クエリを使用して、大量の「結合」を回避できます。

于 2013-01-05T04:12:45.937 に答える
0

UNPIVOTを試しましたか?SQL Server のバージョンによって異なりますが、次の例は SQL 2008 で動作します。

DECLARE @t TABLE (Col1 INT, col2 INT, col3 INT)
INSERT INTO @t
        ( Col1, col2, col3 )
VALUES  ( 1, -- Col1 - int
          2, -- col2 - int
          3  -- col3 - int
          ),
          ( 4, -- Col1 - int
          5, -- col2 - int
          6  -- col3 - int
          )


 SELECT  cols
 FROM (SELECT col1, col2, col3 FROM @t) pvt
 UNPIVOT
 (Cols FOR ID IN (col1, col2, col3))  unpvt     
 WHERE cols <> 2
于 2013-01-06T04:24:23.933 に答える