Мой запрос довольно большой, но для понимания цели я вставляю здесьSubquery вернулся более чем 1 значение даже с оператором IN
SELECT DISTINCT
ISNULL(CD.InteractionID,'') AS InteractionID
, ISNULL(CD.CaseID,'') AS CaseID
, ISNULL(CD.AnalysisMonth,'') + '-' + CAST(AnalysisYear AS VARCHAR(10)) AS MonYr
, ISNULL(ServiceType,'') AS ServiceType
, ISNULL(ServiceSubType,'') AS ServiceSubType
, ISNULL(SM.SourceName,'') AS SourceName
, ISNULL(UserComment,'') AS UserComment
, ISNULL(Final,'') AS Final
, ISNULL(SYSM.SystemName,'') AS SystemName
, ISNULL(SSM.SubSystem,'') AS SubSystem
, ISNULL(CM.CategoryDesc,'') AS CategoryDesc
, ISNULL(ITCM.ITCommentDesc,'') AS ITCommentDesc
, ISNULL(Casedetails,'') AS Casedetails
, ISNULL(TempRCA,'') AS TempRCA
, ISNULL(FinalRCA,'') AS FinalRCA
, ISNULL(SysOwnerComments ,'') AS SysOwnerComments
FROM
[IT_COMPLAINTS].[ITC_Casedetails] CD WITH (NOLOCK)
INNER JOIN [IT_COMPLAINTS].ITC_SourceMaster SM WITH (NOLOCK) ON CD.SourceID =SM.SourceID
LEFT JOIN [IT_COMPLAINTS].[ITC_SystemMaster] SYSM WITH (NOLOCK) ON CD.SystemID =SYSM.SystemID
LEFT JOIN [IT_COMPLAINTS].[ITC_SubSystemMaster] SSM WITH (NOLOCK) ON CD.SubSystemID=SSM.SubSystemID AND CD.SystemID=SSM.SystemID
LEFT JOIN [IT_COMPLAINTS].[ITC_CategoryMaster] CM WITH (NOLOCK) ON CD.CategoryID =CM.CategoryID
LEFT JOIN [IT_COMPLAINTS].[ITC_ITCommentMaster] ITCM WITH (NOLOCK) ON CD.ITCommentID=ITCM.ITCommentID
INNER JOIN [IT_COMPLAINTS].[ITC_SystemUserMapping] MAP WITH (NOLOCK) ON SSM.SubSystemID = MAP.SubSystemID
WHERE
(IsNull(@InteractionNo,'')='' OR ISNULL(CD.InteractionID,'')[email protected])
AND (ISNULL(@Mon,'')='' OR ISNULL(CD.AnalysisMonth,'')[email protected])
AND (IsNull(@Year,0)=0 OR ISNULL(CD.AnalysisYear,'')[email protected])
--
AND CD.SystemID IN
(CASE WHEN @SystemID = 0 THEN
(SELECT SystemID
FROM IT_COMPLAINTS.ITC_SystemUserMapping
WHERE UserID = @UserID AND IsActive = 1)
ELSE @SystemID END)
AND CD.SubSystemID IN
(CASE WHEN @SystemID = 0 THEN
(SELECT SubSystemID
FROM IT_COMPLAINTS.ITC_SystemUserMapping
WHERE UserID = @UserID AND IsActive = 1)
WHEN @SystemID > 0 AND @SubSystemID = 0 THEN
(SELECT SubSystemID
FROM IT_COMPLAINTS.ITC_SystemUserMapping
WHERE UserID = @UserID AND
IsActive = 1 AND
SystemID = @SystemID)
ELSE @SubSystemID END)
--
AND (ISNULL(@CategoryID,'')='' OR ISNULL(CD.CategoryID,'')[email protected])
AND (ISNULL(@ITCommentID,0)=0 OR ISNULL(CD.ITCommentID,'')[email protected])
Однако, когда я запускаю это, он дает мне ошибку
подзапрос возвращает более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, < =,>,> = или когда подзапрос используется как выражение.
Проблема в следующем составе
AND CD.SystemID IN
(CASE WHEN @SystemID = 0 THEN
(SELECT SystemID
FROM IT_COMPLAINTS.ITC_SystemUserMapping
WHERE UserID = @UserID AND
IsActive = 1) ELSE @SystemID END)
AND CD.SubSystemID IN
(CASE WHEN @SystemID = 0 THEN
(SELECT SubSystemID
FROM IT_COMPLAINTS.ITC_SystemUserMapping
WHERE UserID = @UserID AND
IsActive = 1)
WHEN @SystemID > 0 AND @SubSystemID = 0 THEN
(SELECT SubSystemID
FROM IT_COMPLAINTS.ITC_SystemUserMapping
WHERE UserID = @UserID AND
IsActive = 1 AND
SystemID = @SystemID)
ELSE @SubSystemID END)
, когда я комментирую это, мой запрос работает, но, Что проблема с IN
Subquery
и Case
здесь?
Я не думаю, что вы можете использовать '' CASE' внутри IN (...) ' – zedfoxus
у вас есть несколько подзапросов в таком состоянии. Один из них возвращает более одного значения. –
Замените эту часть ЛЕВЫМИ СОЕДИНЕНИЯМИ. ON x = y AND .. – Mihai