首页 > 解决方案 > 一次查询根据父标签获取父代码

问题描述

我们需要在一个查询或一个带有子查询的查询中从类似于下面所有的结果集中获取基于父 TAG 的父代码。TAG 字段以 3 的倍数相加(例如 AAA、AAAAAA、AAAAAB 等等)。因此,父标签始终是子标签的长度 - 3)。我们认为可能是像下面这样的子查询,但它为每条记录返回 NULL。

Select [Level], [Code], [TAG], LEFT([TAG], LEN([TAG]) -3) AS [Parent TAG], [Parent Code] = CASE WHEN [LEVEL] = 1 THEN NULL ELSE (SELECT [CODE] FROM [MyTable] WHERE [TAG] = LEFT([TAG], LEN([TAG]) -3) END)
FROM [MyTable]

或者:

Select [Level], [Code], [TAG], LEFT([TAG], LEN([TAG]) -3) AS [Parent TAG], [Parent Code] = CASE WHEN [LEVEL] = 1 THEN NULL ELSE (SELECT [CODE] FROM [MyTable] WHERE [TAG] = [Parent Tag] END)
FROM [MyTable]

数据:

|Level|Code |Tag      |Parent Tag|Parent Code|
|     |     |         |          |           |
| 1   |1.0  |AAA      |          |           |
| 2   |1.1  |AAAAAA   |AAA       |           |
| 3   |1.1.1|AAAAAAAAA|AAAAAA    |           |  
| 2   |1.2  |AAAAAB   |AAA       |           |
| 3   |1.1.2|AAAAAAAAB|AAAAAB    |           |
| 2   |1.3  |AAAAAC   |AAA       |           |
| 3   |1.3.1|AAAAACAAA|AAAAAC    |           | 

因此,第一个 2 级记录父代码将为 1.0,第一个 3 级记录父代码将为 1.1.1,依此类推...

任何建议,将不胜感激。

标签: sqlsql-servertsql

解决方案


您可以自行加入表:

select
    t.*,
    p.code
from mytable t
left join mytable p on p.tag = t.parent_tag

在这里使用很重要left join,因此没有父级的记录不会从结果集中被逐出(除非您确实想要这样做)。

如果相同的tag可能出现在不同的级别,您可以使连接条件更具体:

select
    t.*,
    p.code
from mytable t
left join mytable p on p.tag = t.parent_tag and p.level = t.level - 1

推荐阅读