2

私は次のことを達成しようとしています:

SELECT col1, col2 FROM table1
UNION
SELECT col2, col3 FROM table2

結果:

col1, col2, col3
1   , 1   , NULL
NULL, 1   , 1

列と行の結合が返されます。これは、FULL OUTER JOIN に相当する UNION と考えることができます。

この質問に対する簡単な答えは次のとおりです。

SELECT col1, col2, NULL AS col3 FROM table1
UNION
SELECT NULL AS col1, col2, col3 FROM table2

ただし、これを動的 T-SQL と dbo.sp_executesql で行うのは難しく、多数の UNION が関係している場合、結果のクエリが長くなりすぎる可能性があります。

私が思いついた最善の解決策は、次のように、可能なすべての列を含む一時テーブルを作成し、各選択を一時テーブルに順番に挿入することでした。

CREATE TABLE #temp ( col1 int, col2 int, col3 int )
INSERT INTO #temp ( col1, col2 ) SELECT col1, col2 FROM table1
INSERT INTO #temp ( col2, col3 ) SELECT col2, col3 FROM table2

ただし、これには列名が何であるかを事前に知っておく必要があります。私の特定のシナリオとこの質問では、列名が一致する場合、型も一致すると想定しています。実際、操作しようとしている列はすべて同じ型です。

これを行う簡単な方法はありますか?

ありがとう!

4

4 に答える 4

1

あなたの質問の私の解釈は、動的 SQL と列名とデータ型についての話を考えると、アドホック クエリをサポートできるようにしたいということです...

このクエリは、特定のテーブルの列とそのデータ型のリストを提供します。

SELECT @columnName = c.name AS columnName,
       @columnDataType = ty.name AS columnDataType
  FROM SYS.TABLES ta
  JOIN SYS.COLUMNS c ON c.object_id = ta.object_id
  JOIN SYS.TYPES ty ON ty.user_type_id = c.user_type_id
 WHERE ta.name = '[your_table_name]'

これにより@columnName&@columnDataType変数が設定され、他の場所で使用できるようになります。

単一の列の意味のあるデータを取得するには、少なくとも列名と列が存在するテーブル名を指定する必要があります。その後、必要なクエリを作成するために何をするかについて必要なロジックを構築することが重要です。

より簡単なアプローチは、ほとんどの状況で必要なクエリを判断することです。
悲しいことに、あなたが尋ねたとき、答えは通常「すべて」です. その応答のために、私はあなたが必要とするすべての通貨と時間をサポートするために物事をレイアウトします. 要件を管理しやすい部分に分割する方が安価で高速であることを強調します。これにより、フィードバックを得ることができます。機能の小さなサブセットを誰も使用しないか、ユーザーがまったく必要としていないものである可能性があります。クライアントの期待を管理する方法を学びます。

于 2009-12-06T21:05:45.720 に答える
0

これは(いくつかのダミー列に参加して)洞察を与えるのに役立ちますか?

declare @t1 table(col1 varchar(10),col2 varchar(10))
declare @t2 table(col2 varchar(10),col3 varchar(10))
insert into @t1 select '1','1' union all select '10','1'
insert into @t2 select '1',null union all select '10','1'

;with cte1 as(select ROW_NUMBER() over(order by getdate()) rn1, t1.* from @t1 t1)
,cte2 as(select ROW_NUMBER() over(order by getdate()) rn2, t2.* from @t2 t2)
select c1.col1,c1.col2,c2.col3
from cte1 c1 
full outer join cte2 c2
on c1.rn1 = c2.rn2

出力:

col1    col2    col3
1   1   NULL
10  1   1
于 2009-12-07T05:05:59.410 に答える
0

私はこれにタオルを投げつけ、厄介な動的 T-SQL を大量に作成し、sp_executesql で実行しました。助けてくれてありがとう!

于 2009-12-13T05:12:20.773 に答える
0

簡単に試した後、T-SQL で取得できる最も近い方法は、ハッキングの炎上するフープを飛び越えずに、false 条件で FULL OUTER JOIN を使用することです...たとえば

DECLARE @TableA TABLE (Col1 INTEGER IDENTITY(1,1), Col2 INTEGER)
DECLARE @TableB TABLE (Col2 INTEGER IDENTITY(1,1), Col3 INTEGER)

INSERT @TableA VALUES (1)
INSERT @TableA VALUES (11)
INSERT @TableB VALUES (2)
INSERT @TableB VALUES (222)

SELECT *
FROM @TableA a
    FULL OUTER JOIN @TableB b ON 0 = 1

ただし、結果から、Col2 が結果セットに 2 回含まれていることがわかります...1 つに結合されていません。

私の提案は、T-SQL で試すのではなく、これの上にあるコードでこれを処理することです。呼び出し元のコードに複数の結果セットを返し、さまざまなスキーマを処理するようにします。1 つの結果セットとして本当に必要な場合、その呼び出しコードは結果を 1 つに結合できませんか?

于 2009-12-06T20:48:43.960 に答える