问题描述
我想根据条件比较IN
语句中的两个不同的表。
SELECT DISTINCT
cts.ContactType,ISNULL(ctl.[Description],CONCAT('Unknown Contact Type: ',cts.ContactType)) AS [Description]
FROM
( SELECT Null AS [ContactType]
WHERE ISNULL(Null,'') <> ''
UNION ALL
SELECT DISTINCT cta.ContactType
FROM
(SELECT u.AccessUserID
FROM v2010_vUsers u
WHERE u.UserID = 'harry_1@cared_t'
UNION ALL
SELECT ur.AccessUserID
FROM v2010_UserRoles ur
WHERE ur.UserID = 'harry_1@cared_t') r --Roles user has
INNER JOIN v2010_UDV_ContactType_AccessMatrix_Full cta --ContactTypes Accessible
ON cta.AccessUserID = r.AccessUserID) cts --ContactTypes Selectable
LEFT JOIN v2010_ListEntries ctl --ContactType List
ON ctl.ListId='CONTACTTYPE' and ctl.Code = cts.ContactType
WHERE cts.ContactType In
(
CASE WHEN (SELECT dbo.f2010_IsFeatureAllowedInTenancy('ContactTypeSC',dbo.f2010_PartnerDivisionID('06b30841-2496-48ef-b91a-21f06a9299f2'))) = '1'
THEN (SELECT Code From v2010_ListEntries WHERE ListId='CONTACTTYPESC')
ELSE (SELECT Code From v2010_ListEntries WHERE ListId='CONTACTTYPE')
END
)
错误:子查询返回了多个值。这是不允许的 当子查询遵循=,!=,,> =时,或者当子查询为 用作表达式。
错误在以下几行:
WHERE cts.ContactType In
(
CASE WHEN (SELECT dbo.f2010_IsFeatureAllowedInTenancy('ContactTypeSC',dbo.f2010_PartnerDivisionID('06b30841-2496-48ef-b91a-21f06a9299f2'))) = '1'
THEN (SELECT Code From v2010_ListEntries WHERE ListId='CONTACTTYPESC')
ELSE (SELECT Code From v2010_ListEntries WHERE ListId='CONTACTTYPE')
END
)
在IN语句中,我无法使用大小写。如果我在WHERE cts.ContactType中写(从v2010_ListEntries中的SELECT代码WHERE ListId ='CONTACTTYPESC'),它可以工作,但是我想比较条件并基于条件比较表。
解决方法
很难确定多行问题的来源,但我在想:
WHERE (dbo.f2010_IsFeatureAllowedInTenancy('ContactTypeSC',dbo.f2010_PartnerDivisionID('06b30841-2496-48ef-b91a-21f06a9299f2')) = '1' and
cts.ContactType In (SELECT Code From v2010_ListEntries WHERE ListId = 'CONTACTTYPESC')
) OR
(dbo.f2010_IsFeatureAllowedInTenancy('ContactTypeSC',dbo.f2010_PartnerDivisionID('06b30841-2496-48ef-b91a-21f06a9299f2')) <> '1' and
cts.ContactType In (SELECT Code From v2010_ListEntries WHERE ListId = 'CONTACTTYPE'')
)
或更简单地说:
cts.ContactType In (SELECT le.Code
FROM v2010_ListEntries le CROSS JOIN
(VALUES (CASE WHEN dbo.f2010_IsFeatureAllowedInTenancy('ContactTypeSC',dbo.f2010_PartnerDivisionID('06b30841-2496-48ef-b91a-21f06a9299f2')) THEN 'CONTACTTYPESC' ELSE 'CONTACTTYPESC' END)) v(listId)
WHERE le.ListId = v.ListId
)