Судя по последним данным, вы получите желаемый результат:
WITH rCTE AS(
SELECT 1 AS Level,
id AS GroupID,
[name] AS GroupName,
CONVERT(nvarchar(10),NULL) AS ParentID, --This'll be uniqueidentifier in your real version
CONVERT(nvarchar(255),NULL) AS ParentName
FROM BPAGroup G
WHERE NOT EXISTS (SELECT 1
FROM BPAGroupGroup e
WHERE e.memberid = G.id)
UNION ALL
SELECT r.Level + 1,
G.id AS GroupID,
G.[name] AS GroupName,
r.GroupID AS ParentID,
r.[GroupName] AS ParentName
FROM BPAGroup G
JOIN BPAGroupGroup GG ON G.id = GG.memberid
JOIN rCTE r ON GG.groupid = r.GroupID)
SELECT *
FROM rCTE;
Важно, чтобы вы понимали, как это работает хотя. Как вы сказали в своем посте, вам, кажется, нужно каждый раз пересматривать их. Нет ничего плохого в том, что нужно что-то проверять синтаксис (есть некоторые вещи, которые я иногда с треском проваливаю при запоминании, особенно новые вещи OPENJSON
), но понимаете ли вы, как это работает? Если нет, какой бит не так ли?
/* foo.c */
int main() {
if (1) ;
return 0;
}
gcc -Wextra -c foo.c
foo.c: In function ‘main’:
foo.c:2: warning: empty body in an if-statement
После глубокого изучения руководства по gcc:
-Wempty-body
Warn if an empty body occurs in an `if', `else' or `do while' statement. This warning is also enabled by
-Wextra.
Как некоторые другие плакаты написал: -Wextra должна это сделать
Пример кода:
int main(){
if (0);
printf("launch missiles");
return 0;
}
$gcc -Wempty-body foo.c
warn.c: In function ‘main’:
warn.c:5: warning: suggest braces around empty body in an ‘if’ statement
В дополнение к вышесказанному, если вы столкнетесь с проблемой поиска ошибки с помощью valgrind или аналогичного профилировщика выполнения , возможно, вам стоит рассмотреть возможность использования инструмента статического анализа, такого как lint . Лично я использую PC-LINT , который отлавливает все виды ошибок такого типа.
В качестве альтернативы компилятору я обнаружил, что запуск автоиндентора кода помогает найти такие ситуации.
Например, в vim:
gg=G