如何在SQL Server 2019中返回多个int值?

问题描述 投票:0回答:1

我创建了一个 BST 表,其中有两列 Node 和 Parent 作为整数数据类型。我在这个表中插入一些值,我想检测叶节点、内部节点和根节点。

代码:

CREATE TABLE BST 
(
    Node int,
    Parent int
);

INSERT INTO BST (Node, Parent) VALUES (1, 2);
INSERT INTO BST (Node, Parent) VALUES (3, 2);
INSERT INTO BST (Node, Parent) VALUES (6, 8);
INSERT INTO BST (Node, Parent) VALUES (9, 8);
INSERT INTO BST (Node, Parent) VALUES (2, 5);
INSERT INTO BST (Node, Parent) VALUES (8, 5);

INSERT INTO BST (Node) VALUES (5);

我写了这个查询:

SELECT
    Node,
    CASE
        WHEN Parent IS NULL THEN 'Root'
        WHEN Node_ IS NOT NULL AND Parent IS NOT NULL
             AND (SELECT Node_ FROM BST) NOT IN (SELECT Parent FROM BST) 
            THEN ('Leaf')
        WHEN Node IS NOT NULL AND Parent IS NOT NULL
             AND (SELECT Parent FROM BST) NOT IN (SELECT Node FROM BST)
            THEN ('Inner')
    END
FROM
    BST;

我期待得到这样的结果:

1 Leaf
2 Inner 
3 Leaf
5 Root
6 Leaf
8 Inner
9 Leaf

但我收到此错误:

子查询返回超过 1 个值。当子查询跟在 =、!=、<, <= , >、>= 后面或子查询用作表达式时,这是不允许的。

有人对这个问题有任何想法吗?这是语法错误还是逻辑错误?或者我的算法不正确...

sql sql-server case binary-search-tree
1个回答
0
投票

我假设您正在寻找 sql server 中的递归 CTE?您的查询不起作用,因为您无法在子查询中调用查询本身。我在这里只是添加一个粗略的想法,如果你想了解更多关于Recursive CTE,请查看msdn https://learn.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver16

WITH Root AS (
  SELECT
    Node,
    1 AS level
  FROM BST
  WHERE parent IS NULL
  UNION ALL
  SELECT
    b.parent,
    level + 1
  FROM BST b
  INNER JOIN Root r
    ON b.Parent = r.Node
)
SELECT *
FROM Root;
© www.soinside.com 2019 - 2024. All rights reserved.