sql-server - 当事件值为空时如何获取事件头值
问题描述
我有一个关于 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 中的 CTE,此链接将为您提供查询所需的一切。希望能帮助到你
推荐阅读
- c++ - 如何通过 cpp 程序运行 shell 脚本?
- sql-server - Azure Web 应用上用于 SQL Server 的 ODBC 驱动程序
- python - 如何在散点图中设置图表内的标题位置?
- applescript - Applescript一个窗口调整大小,另一个没有
- agda - 在 Cubical 模式下定义非一元函数
- php - How to decode json, group by a column value, and sum values in each group?
- javascript - AngularJS路由阻止默认并继续
- three.js - GLTFLoader global variable undefined
- html - 我怎样才能只用css设计一个句子的第一个单词
- oracle-golden-gate - Sizing requirements for Oracle downstream mining database while using Oracle Golden gate Downstream Integrated Capture