【发布时间】:2020-05-09 19:53:20
【问题描述】:
我有一个关于 SQL Server 的问题:如果使用自联接,如果事件值为空,如何获取事件值?
源表:product
我需要检查 parentid 是否存在子 ID 值(如果存在),然后在值为 null 或为空时获取标题事件值。
CREATE TABLE [dbo].[product]
(
[productid] [varchar](50) NULL,
[parentid] [int] NULL,
[childid] [int] NULL,
[event] [varchar](50) NULL
)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', NULL, 64, N'billing')
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 64, 65, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 65, 66, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 64, 67, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 67, 68, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 67, 69, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 67, 70, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 67, 71, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', NULL, 5, N'collect')
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 5, 6, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 6, 7, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 6, 8, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 5, 9, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 9, 10, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'1', 9, 11, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'2', NULL, 24, N'billing')
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'2', 24, 25, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'2', NULL, 101, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'2', NULL, 102, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'2', 25, 30, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'2', 101, 70, NULL)
INSERT INTO [dbo].[product] ([productid], [parentid], [childid], [event])
VALUES (N'2', 102, 80, NULL)
根据这些数据,我想要这样的输出:
id | parentid | childid | event
---+----------+---------+--------
1 | null | 64 | billing
1 | 64 | 65 | billing
1 | 65 | 66 | NULL
1 | 64 | 67 | billing
1 | 67 | 68 | billing
1 | 67 | 69 | billing
1 | 67 | 70 | billing
1 | 67 | 71 | billing
1 | NULL | 05 | collect
1 | 05 | 06 | collect
1 | 06 | 07 | collect
1 | 06 | 08 | collect
1 | 05 | 09 | collect
1 | 09 | 10 | collect
1 | 09 | 11 | collect
2 | NULL | 24 | billing
2 | 24 | 25 | billing
2 | NULL | 101 | billing
2 | NULL | 102 | billing
2 | 25 | 32 | billing
2 | 101 | 70 | billing
2 | 102 | 80 | billing
我试过这个查询:
SELECT
prodcutid,
ISNULL(p.parentid, c.parentid) parentid,
ISNULL(p.childid, c.childid) childid,
ISNULL(p.event, c.event) event
FROM
product p
JOIN
product c ON p.parentid = c.childid
AND p.id = c.id
我无法获得预期的结果。你能告诉我如何在 SQL Server 中完成这项任务吗?
【问题讨论】:
标签: sql-server sql-server-2008 sql-server-2012