sql >> Database >  >> RDS >> Sqlserver

Waarom geeft subquery binnen recursieve tekenreeksaaneenschakeling altijd NULL terug?

Dit is een heel rare manier om een ​​treewalker te implementeren, @id in de SELECT te verhogen en te verwachten dat het van toepassing is op de subquery. Het werkt niet omdat SQL Server de waarde van @id voor de subquery-expressie vergrendelt als een constante in de query-instellingsfase.

Zie dit voorbeeld, waar de geretourneerde @waarde duidelijk aangeeft dat @id is vergrendeld op 1. Met uw vraag was deze vergrendeld op 0, vandaar dat elke subquery NULL retourneert, ogenschijnlijk omdat er geen overeenkomst is voor @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

Als je alleen de waarden van 2 wilt, correleer dan in plaats van de variabele @id de subquery met de table.id zoals hieronder:

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. Hoe een tabel bijwerken met een selecte groep door in een tweede en zichzelf als de gegevensbron in MySQL?

  2. Hoe MySQL op Ubuntu te installeren

  3. verkeerd aantal of soorten argumenten in aanroep van mijn procedure

  4. PHP foreach gebruikersscript lijkt apache te laten hangen