首页 > 解决方案 > 当事件值为空时如何获取事件头值

问题描述

我有一个关于 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-serversql-server-2008sql-server-2012

解决方案


您正在寻找的是 SQL Server 中的 CTE,此链接将为您提供查询所需的一切。希望能帮助到你

SQL 服务器 CTE


推荐阅读