sql - 一次查询根据父标签获取父代码
问题描述
我们需要在一个查询或一个带有子查询的查询中从类似于下面所有的结果集中获取基于父 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,依此类推...
任何建议,将不胜感激。
解决方案
您可以自行加入表:
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
推荐阅读
- c# - 从 Visual Studio 在 Github.com 中打开一个文件
- css - 是否可以在不使用 CSS 中的媒体查询的情况下保持段落的宽度(桌面 - 移动)?
- python - 如何在django中重定向到另一个包含ID的页面
- r - 使用箱线图对大型数据集进行可视化
- database - 我的播种机没有在我的数据库中存储信息
- javascript - 单击特定按钮时如何禁用数据表中的排序
- azure - 在 Azure 应用服务的 IIS 日志中记录 TLS 相关数据
- java - 有没有什么方法可以用保留位置的情况来反转单词
- scala - 在 Scala 中使用 Recovery 编写期货
- .net - ViewBox 中的 Oxyplot 模糊