【问题标题】:Printing strings next to each output row in sql? [closed]在sql中的每个输出行旁边打印字符串? [关闭]
【发布时间】:2023-03-26 17:06:01
【问题描述】:

我一直在寻找这个问题的答案。我有一个名为“Tree”的表,其中包含节点的 pid 和另一个包含父 pid (ppid) 的列。该表包含:

Pid     Ppid
1           2
3           2
5           6
7           6
2           4
6           4
4           15
8           9
10      9
12      13
14      13
9           11
13      11
11      15
15      NULL

目的是在使用 Oracle/sql/sql server/etc 的单个查询中在 Pid 列旁边打印一条消息,说明节点的类型,即“Leaf”、“Inner”或“Root”。 输出应该是这样的:

1           Leaf
2           Inner
3           Leaf
4           Inner
5           Leaf
6           Inner
7           Leaf
8           Leaf
9           Inner
10      Leaf
11      Inner
12      Leaf
13      Inner
14      Leaf
15      Root

我只需要知道打印新列值的方式。有人可以帮帮我吗? 提前谢谢你:)

【问题讨论】:

  • 那么,mysql、SQL Server 还是 Oracle?,选择一个
  • 在单个查询中使用 Oracle/sql/sql server/etc 真的
  • 然后告诉我们你要去哪里以及你被困在哪个特定部分......
  • 任何,sql 或 mysql 或 Oracle 或 sql server
  • 我什至不知道如何开始,请帮助

标签: mysql sql sql-server oracle


【解决方案1】:

SQL SERVER & Oracle 中可以使用Recursive CTE 实现

这是给SQL SERVER

;WITH data
     AS (SELECT *
         FROM   (VALUES (1,2 ),
                        (3,2 ),
                        (5,6 ),
                        (7,6 ),
                        (2,4 ),
                        (6,4 ),
                        (4,15 ),
                        (8,9 ),
                        (10,9 ),
                        (12,13 ),
                        (14,13 ),
                        (9,11 ),
                        (13,11 ),
                        (11,15 ),
                        (15,NULL ) ) tc (Pid, Ppid)),
     rec_cte
     AS (SELECT *
         FROM   data
         UNION ALL
         SELECT d.*
         FROM   rec_cte rc
                JOIN data d
                  ON rc.Ppid = d.Pid)
--select * from rec_cte
    SELECT Pid,
           CASE Count(Ppid)
             WHEN 0 THEN 'root'
             WHEN 1 THEN 'leaf'
             ELSE 'inner'
           END level
    FROM   rec_cte
    GROUP  BY Pid 

结果:

╔═════╦═══════╗
║ Pid ║ level ║
╠═════╬═══════╣
║   1 ║ leaf  ║
║   2 ║ inner ║
║   3 ║ leaf  ║
║   4 ║ inner ║
║   5 ║ leaf  ║
║   6 ║ inner ║
║   7 ║ leaf  ║
║   8 ║ leaf  ║
║   9 ║ inner ║
║  10 ║ leaf  ║
║  11 ║ inner ║
║  12 ║ leaf  ║
║  13 ║ inner ║
║  14 ║ leaf  ║
║  15 ║ root  ║
╚═════╩═══════╝

【讨论】:

  • 这里的“数据”指的是表“树”?
  • @PrakharSaxena - 是的.. 对于演示,我使用了表值构造函数。用你的表名替换它
  • 如何跳过列名行?
  • @PrakharSaxena 列名行在哪里?
  • @PrakharSaxena - 您在哪个 DBMS 中执行?
猜你喜欢
  • 1970-01-01
  • 2021-02-24
  • 2022-10-07
  • 2017-09-05
  • 2013-06-16
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多