Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中如何在case中使用join?_Sql_Sql Server - Fatal编程技术网

在SQL Server中如何在case中使用join?

在SQL Server中如何在case中使用join?,sql,sql-server,Sql,Sql Server,在以下情况下,如何将“in”转换为内部联接: SELECT m.*, atypcode_type = CASE WHEN m.[ATYPCODE] IS NOT NULL AND m.[ATYPCODE] IN (SELECT lastlevel FROM [dbo].[t

在以下情况下,如何将“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

用case创建col
atypcode\u type
,但此代码太慢

这回答了您提出的问题:

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
的来源

我有几点评论。首先,我发现很难想象这段代码有什么用处。它似乎以一种相当复杂的方式混合了水平和父母。您尚未解释数据结构,因此这可能是您想要的

第二,这不会带来性能提升。您不需要指定为什么要切换到
加入
。如果这就是原因的话,这几乎没有什么好处


这与第三个原因有关不要将多个值存储为逗号分隔的列表。这不是存储数据的SQL方法。关系数据库具有这种存储列表的强大数据结构。它被称为一个表,而不是一个字符串。

示例数据和预期结果会有所帮助,如果没有别名,我们不知道第二条语句中的哪个列属于哪个列。然而,第二条语句也意味着您正在表中存储分隔数据。你真的应该正常化它。将逗号分隔的列拆分为值表。自2016年以来,如果使用以前的版本查找用户函数,sqlserver将使用
STRING\u SPLIT
。有关选项,请参阅。