sql >> データベース >  >> RDS >> Sqlserver

再帰的な文字列連結内のサブクエリが常に NULL を返すのはなぜですか?

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

    この例を参照してください。返された @value は、@id が 1 でロックされていることを明確に示しています。質問では、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 [email protected]) + '-',
        @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
    


    1. postgresでテーブル(インデックスを含む)をコピーします

    2. Oracleでxml要素の値を選択します

    3. 左結合からのPostgresの更新

    4. php mysql insert(max(id)+1)