如果出现以下情况,如何将“ 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
,但是这段代码太慢了
答案 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 。