Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tại sao truy vấn con bên trong nối chuỗi đệ quy luôn trả về NULL?

Đây là một cách rất kỳ lạ khi cố gắng triển khai một treewalker, tăng @id trong SELECT và mong đợi nó áp dụng cho truy vấn con. Nó không hoạt động vì SQL Server khóa giá trị của @id cho biểu thức truy vấn con dưới dạng một hằng số ngay ở giai đoạn thiết lập truy vấn.

Hãy xem ví dụ này, trong đó @value trả về chỉ ra rõ ràng rằng @id bị khóa ở 1. Với câu hỏi của bạn, nó bị khóa ở 0, do đó mỗi truy vấn con sẽ trả về NULL, bề ngoài là do không có kết quả phù hợp với @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

Nếu bạn chỉ muốn các giá trị từ 2, thì thay vì biến @id, bạn chỉ cần tương quan truy vấn con với table.id như bên dưới:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nối hai số nguyên và kết quả là chuỗi trong SQL

  2. Làm cách nào để tạo và truy vấn các máy chủ cơ sở dữ liệu được liên kết trong SQL Server?

  3. sql server 2008 - hằng số không phải là số nguyên trong Mệnh đề ORDER BY

  4. Có cách nào tốt để gỡ lỗi Chuỗi hoặc dữ liệu nhị phân sẽ bị cắt bớt không?

  5. Những yếu tố nào có thể gây ra việc biên dịch thủ tục đã lưu trữ trên SQL Server?