簡體   English   中英

在SQL Server中如何使用聯接?

[英]How can I use join in case in SQL Server?

在以下情況下,如何將“輸入”轉換為內部聯接:

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 ,但是此代碼太慢

這回答了您提出的問題:

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存儲數據的方式。 關系數據庫具有很好的數據結構來存儲列表。 它稱為 ,而不是字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM