Получить родительский код на основе родительского тега в одном запросе - PullRequest
0 голосов
/ 16 февраля 2020

Нам нужно получить родительский код на основе родительского тега из набора результатов, аналогичного приведенному ниже, в одном запросе или одном запросе с подзапросом. Поле 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 и т. Д. *

Будем благодарны за любые предложения.

1 Ответ

0 голосов
/ 16 февраля 2020

Вы можете самостоятельно присоединиться к таблице:

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

Здесь важно использовать left join, поэтому записи без родителя не исключаются из набора результатов (если вы этого не хотите) .

Если один и тот же tag может появляться на разных уровнях, вы можете сделать условие соединения более конкретным c:

select
    t.*,
    p.code
from mytable t
left join mytable p on p.tag = t.parent_tag and p.level = t.level - 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...