1

2つのテーブルがあるとします。

  • 表1:処理する必要のあるIDのリストがあります。
  • 表2:IDと値のキーと値のペアがあります。

TABLE1のすべてのIDの値をTABLE2から単一の文字列として取得する必要があります。これを実現するために、次のクエリを実行しました。

DECLARE @id INT, @value VARCHAR(10);

SELECT @id=0, @value='';

SELECT
    @value = @value + (SELECT TOP 1 value FROM TABLE2 WHERE id=@id) + '-',
    @id = @id+1
FROM TABLE1

しかし、このクエリを実行すると、サブクエリは常にnullを返します(したがって、@value=NULL最後に)。私の質問はSELECT TOP 1 value FROM TABLE2 WHERE id=@id、IDがTABLE2にある場合でも、サブクエリが常にNULLを返すのはなぜですか?

4

3 に答える 3

4

これは、ツリーウォーカーを実装しようとする非常に奇妙な方法であり、SELECTで@idを増やし、サブクエリに適用されることを期待しています。SQL Serverは、クエリのセットアップフェーズで、サブクエリ式の@idの値を定数としてロックするため、機能しません。

この例を参照してください。返された@valueは、@ idが1でロックされていることを明確に示しています。質問では、@ idが0でロックされているため、@ id = 0に一致するものがないため、各サブクエリはNULLを返します。

create table table1 (
  id int);
create table table2 (
  id int, value varchar(10));
insert table1 values (1),(2),(3),(4);
insert table2 values
(1,1),
(2,2),
(3,3),
(4,4);

DECLARE @id INT, @value VARCHAR(10);

SELECT @id=1, @value='';

SELECT
    @value = @value + (SELECT TOP 1 value FROM TABLE2 WHERE id=@id) + '-',
    @id = @id+1
FROM TABLE1;

select @value, @id

-- result
1-1-1-1       5

単に2の値が必要な場合は、変数@idの代わりに、次のようにサブクエリをtable.idに関連付けます。

create table table1 (id int);
create table table2 (id int, value varchar(10));
insert table1 values (1),(2),(3),(4);
insert table2 values
(1,1),
(3,9),
(4,4);

DECLARE @value VARCHAR(10);

SELECT @value='';

SELECT
    @value = @value + isnull((SELECT TOP 1 value 
                              FROM TABLE2 
                              WHERE id=table1.id) + '-','')
FROM TABLE1;

select @value

-- Result
1-9-4
于 2012-09-28T21:48:09.213 に答える
1

さらに別の解決策(これは、table2の値がNULLでない場合にのみ、table2の値の間に「-」区切り文字を追加します):

declare @id int, @value varchar(max);
select @id = 0, @value='';

select 
    @value = @value + isnull(value,'') + case when value is null then '' else '-' end
from 
    table2 t2
where 
    t2.id in (select id from table1)
于 2012-09-28T21:52:58.243 に答える
1

これは、@ idを0から開始しているためです。テーブルに0のIDがない限り、おそらく次のようにする必要があります。SELECT @ id = 1

または、これに凝縮してIDを使用しないこともできます。

SELECT @value = @value + value +  '-'
FROM TABLE2 t2
INNER JOIN TABLE1 t1 ON t1.id = t2.id
于 2012-09-28T21:56:25.843 に答える