77

一部の結果を再利用してクエリを作成します。結果を変数に入れて使用する方法を検索します。

私が欲しいものを次のように見る簡単な方法 - 私はこれが欲しい:

DECLARE @result1 ?????

SET @result1 = SELECT a,b,c FROM table1
SELECT a AS val FROM @result1
UNION
SELECT b AS val FROM @result1
UNION
SELECT c AS val FROM @result1

これではない :

 SELECT a AS val FROM (SELECT a,b,c FROM table1)
 UNION
 SELECT b AS val FROM (SELECT a,b,c FROM table1)
 UNION
 SELECT c AS val FROM (SELECT a,b,c FROM table1)

私が関心を持っているのはこのクエリの結果ではありませんが、代わりに:

  1. 結果を何度も選択するのをやめる - 私のサンプルでは、​​テーブルを3回再選択しました

  2. のクエリ@result1は通常、はるかに複雑です。したがって、変数を使用すると、コードがよりクリーンになります。

多分私はたくさんしたい - またはローカル変数のタイプがあります。または、型テーブルを使用して内部にデータを設定します。

あなたは私に何を提案しますか?

ありがとうございました

4

4 に答える 4

96

テーブル変数を作成できます。

DECLARE @result1 TABLE (a INT, b INT, c INT)

INSERT INTO @result1
SELECT a, b, c
FROM table1

SELECT a AS val FROM @result1
UNION
SELECT b AS val FROM @result1
UNION
SELECT c AS val FROM @result1

これは、必要なものには問題ありません。

于 2012-04-27T18:11:06.307 に答える
21

ここでは、他の方法をいくつか紹介します。

1.ユニオン付きCTE:

;WITH cte AS (SELECT a, b, c FROM table1)
SELECT a AS val FROM cte
UNION SELECT b AS val FROM cte
UNION SELECT c AS val FROM cte;

2. unpivot を使用した CTE:

;WITH cte AS (SELECT a, b, c FROM table1)
SELECT DISTINCT val
FROM cte
UNPIVOT (val FOR col IN (a, b, c)) u;
于 2012-04-27T19:24:06.413 に答える
6

もちろん、私が質問を正しく理解していれば、これははるかに簡単な解決策ではありませんか。

「spam」というテーブルにある電子メール アドレスを変数にロードしたいと考えています。

select email from spam

次のリストを作成します。たとえば、次のようにします。

.accountant
.bid
.buiilldanything.com
.club
.cn
.cricket
.date
.download
.eu

変数 @list にロードするには:

declare @list as varchar(8000)
set @list += @list (select email from spam)

@list をテーブルなどに INSERT できるようになりました。

これが役立つことを願っています。

.csv ファイルまたは VB で使用するには、コードをスパイクします。

declare @list as varchar(8000)
set @list += @list (select '"'+email+',"' from spam)
print @list

そして、他の場所で使用する既製のコードを生成します。

".accountant,"
".bid,"
".buiilldanything.com,"
".club,"
".cn,"
".cricket,"
".date,"
".download,"
".eu,"

人は非常に創造的です。

ありがとう

ニコ

于 2016-04-26T16:40:42.953 に答える