在SQL Server中如何使用联接?

时间:2019-05-12 10:21:48

标签: sql sql-server

如果出现以下情况,如何将“ 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 个答案:

答案 0 :(得分:1)

这回答了您提出的问题:

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方法。关系数据库具有很好的数据结构来存储列表。它称为,而不是 string