【问题标题】:How to get event header value when event values have null当事件值为空时如何获取事件头值
【发布时间】: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


    【解决方案1】:

    您要查找的内容在 SQL Server 中称为 CTE,此链接将为您提供查询所需的一切。希望对你有帮助

    SQL SERVER CTE

    【讨论】:

      猜你喜欢
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      相关资源
      最近更新 更多