sql >> Databasteknik >  >> RDS >> Sqlserver

Varför returnerar subquery inuti rekursiv strängsammansättning alltid NULL?

Det här är ett väldigt konstigt sätt att försöka implementera en treewalker, öka @id i SELECT och förvänta sig att den ska gälla för underfrågan. Det fungerar inte eftersom SQL Server låser värdet på @id för subquery-uttrycket som en konstant direkt i frågekonfigurationsfasen.

Se det här exemplet, där det returnerade @värdet tydligt indikerar att @id är låst vid 1. Med din fråga var det låst vid 0, därför kommer varje underfråga returnerar NULL, till synes eftersom det inte finns någon matchning för @id =0.

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

Om du bara ville ha värdena från 2, då istället för variabeln @id, korrelerar du bara underfrågan till table.id enligt nedan:

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. Varför behövs putenv() på en redan definierad miljövariabel?

  2. Uppdatera samma rad flera gånger

  3. summa och generera serier fungerar inte i postgresql

  4. ActiveRecord - välj första posten från varje grupp