gpt4 book ai didi

sql - 根据 child id获取 parent SQL

转载 作者:行者123 更新时间:2023-12-01 11:33:23 25 4
gpt4 key购买 nike

我在 Microsoft SQL 环境中有以下场景:

CREATE TABLE grps
(
[id] varchar(50),
[parentid] varchar(50),
[value] varchar(50)
);

INSERT INTO grps
([id], [parentid], [value])
VALUES
('-5001', '0', null),
('-5002', '-5001', null),
('-5003', '-5002', '50'),
('-5004', '-5003', null),
('-5005', '0', null),
('-5006', '0', null),
('-5007', '0', null),
('-5008', '-5006', null);

我正在尝试根据 child 的 ID 获取 parent 。如果查询的 id 是最后一个父级,那么它应该只返回最后一个项目。

例子:

  • 如果我查询:id = '-5004' 它应该返回 ('-5004', '-5003', null),
    ('-5003', '-5002', '50'),
    ('-5002', '-5001', 空),
    ('-5001', '0', 空)
  • 如果我查询 id = '-5007',它应该返回 ('-5007', '0', null)

如果它能在“树”上以有序的方式列出首先查询的 id 和其余的,那就太棒了。

我尝试了几种不同的 CTE 方法,但不幸的是没有成功。所以我在这里寻求一些帮助或想法。

提前致谢。

最佳答案

您在 CTE 方面走在了正确的轨道上。它可以通过使用递归 CTE 来完成!这是递归 CTE 的样子:

DECLARE @ID varchar(50) = '5004';

WITH CTE AS
(
--This is called once to get the minimum and maximum values
SELECT id, parentid, value
FROM grps
WHERE id= @ID
UNION ALL
--This is called multiple times until the condition is met
SELECT g.id, g.parentid, g.value
FROM CTE c, grps g
WHERE g.id= c.parentid
--If you don't like commas between tables then you can replace the 2nd select
--statement with this:
--SELECT g.id, g.parentid, g.value
--FROM CTE c
--INNER JOIN grps g ON g.id= c.parentid
--This can also be written with CROSS JOINS!
--Even though it looks more like another way of writing INNER JOINs.
--SELECT g.id, g.parentid, g.value
--FROM CTE c
--CROSS JOIN grps g
--WHERE g.id = c.parentid
)

SELECT * FROM CTE

请注意最大递归为 100,除非您将 option (maxrecursion 0) 添加到最后一个 select 语句的末尾。 0 表示无限,但您也可以将其设置为您想要的任何值。

尽情享受吧!

关于sql - 根据 child id获取 parent SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30112464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com