Как я могу использовать объединение в случае в SQL Server? - PullRequest
0 голосов
/ 12 мая 2019

Как я могу преобразовать "in" во внутреннее объединение в случае:

SELECT 
    m.*, 
    atypcode_type = CASE 
                       WHEN m.[ATYPCODE] IS NOT NULL 
                            AND m.[ATYPCODE] IN (SELECT lastlevel 
                                                 FROM [dbo].[tbl2] 
                                                 WHERE ','+'2921'+',' LIKE '%,' + CAST([ParentId] AS VARCHAR(10)) + ',%') 
                          THEN 100
                       WHEN m.[ATYPCODE] IS NOT NULL 
                            AND m.[ATYPCODE] IN (SELECT lastlevel 
                                                 FROM [dbo].[tbl2]  
                                                 WHERE ',' + '3366' + ',' LIKE '%,' + CAST([ParentId] AS VARCHAR(10)) + ',%') 
                          THEN 101
                       ....
                    END
FROM 
    [tbl1] m
INNER JOIN
    [tbl2] ncg ON m.ATYPCODE = ncg.lastlevel 

Как я могу преобразовать этот код

m.[ATYPCODE] IN (SELECT lastlevel FROM [dbo].[tbl2] 
                 WHERE ','+'2921'+',' like '%,'+cast([ParentId] AS varchar(10))+',%')

к внутреннему соединению?

Результат:

atypcode    acurrcode   tarikh  atypcode_type
    2741    IRR 1397/06/31  109
    2941    IRR 1397/06/31  109
    3371    IRR 1397/06/31  101
    3381    IRR 1397/06/31  101
    3671    IRR 1397/06/31  101
    3381    IRR 1397/06/31  101
    4371    IRR 1397/06/31  101
    3971    IRR 1397/06/31  101
    3571    IRR 1397/06/31  101
    3771    IRR 1397/06/31  101

Создайте col atypcode_type с регистром, но этот код слишком медленный

1 Ответ

1 голос
/ 12 мая 2019

Это отвечает на вопрос, который вы задали:

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-способ хранения данных. Реляционные базы данных имеют эту великолепную структуру данных для хранения списков. Он называется таблица , а не строка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...