sql >> Databáze >  >> RDS >> Sqlserver

Proč poddotaz v rámci rekurzivního zřetězení řetězců vždy vrací NULL?

Toto je velmi zvláštní způsob, jak se pokusit implementovat treewalker, zvýšit @id v SELECT a očekávat, že se použije na poddotaz. Nefunguje to, protože SQL Server uzamkne hodnotu @id pro výraz poddotazu jako konstantu přímo ve fázi nastavení dotazu.

Podívejte se na tento příklad, kde vrácená @hodnota jasně ukazuje, že @id je uzamčeno na 1. S vaší otázkou bylo uzamčeno na 0, takže každý dílčí dotaz vrátí NULL, zdánlivě proto, že neexistuje žádná shoda pro @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

Pokud jste chtěli pouze hodnoty z 2, pak místo proměnné @id stačí korelovat poddotaz s table.id, jak je uvedeno níže:

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. mysql vyberte z n posledních řádků

  2. Jak určit hodnoty pro chybějící měsíce na základě dat z předchozích měsíců v T-SQL

  3. Jak podřetězec sloupce tabulky MySQL

  4. Klauzule LIKE Mysql a samostatná slova v poli