Это отвечает на вопрос, который вы задали:
SELECT m.*,
(CASE WHEN m.[ATYPCODE] IS NOT NULL AND
t2_2921.lastlevel IS NOT NULL
THEN 100
WHEN m.[ATYPCODE] IS NOT NULL AND
t2_3366.lastlevel IS NOT NULL
THEN 101
....
END) as atypcode_type
FROM [tbl1] m INNER JOIN
[tbl2] ncg
ON m.ATYPCODE = ncg.lastlevel LEFT JOIN
tbl2 t2_2921
ON m.ATYPCODE = t2_2921.lastlevel AND
',' + '2921' + ',' LIKE '%,' + CAST(?.ParentId AS VARCHAR(10)) + ',%') LEFT JOIN
tbl2 t2_3366
ON m.ATYPCODE = t2_3366.lastlevel AND
',' + '3366' + ',' LIKE '%,' + CAST(?.ParentId AS VARCHAR(10)) + ',%')
Предполагается, что в вашем списке с разделителями нет дубликатов.
?
для псевдонима таблицы, чтобы определить, откуда ParentId
.
У меня есть несколько редакционных комментариев. Во-первых, мне трудно представить, что этот код делает что-нибудь полезное. Кажется, что смешение уровней и родителей довольно запутанно. Вы не объяснили свою структуру данных, так что это может быть тем, что вы хотите.
Во-вторых, от этого нет прироста производительности. Вы не указываете , почему вы хотите переключиться на JOIN
. Если это и есть причина, то это мало что дает.
И это связано с третьей причиной. Не хранить несколько значений в виде списков, разделенных запятыми. Это не SQL-способ хранения данных. Реляционные базы данных имеют эту великолепную структуру данных для хранения списков. Он называется таблица , а не строка .