sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor underforespørgsel inde i rekursiv strengsammenkædning altid returnerer NULL?

Dette er en meget mærkelig måde at forsøge at implementere en treewalker på, øge @id i SELECT og forvente, at den gælder for underforespørgslen. Det virker ikke, fordi SQL Server låser værdien af ​​@id for underforespørgselsudtrykket som en konstant lige ved forespørgselsopsætningsfasen.

Se dette eksempel, hvor den returnerede @værdi tydeligt angiver, at @id er låst på 1. Med dit spørgsmål blev den låst på 0, og derfor vil hver underforespørgsel returnere NULL, angiveligt fordi der ikke er noget match for @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

Hvis du blot ville have værdierne fra 2, så korrelerer du i stedet for variablen @id bare underforespørgslen til table.id som nedenfor:

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. Laver en stor opdatering ved hjælp af flere tabeller i PostgreSQL

  2. Brug af dvaleværktøjer til at omdanne pojos fra Postgres

  3. Sådan indsætter du JSON i en kolonnedata, hvis underforespørgsel returnerer mere end 1 række i MySQL

  4. Algoritme til at vælge de mest populære steder fra databasen