Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2005 Forums
 Transact-SQL (2005)
 Subquery returned more than 1 value....

Author  Topic 

Zath
Constraint Violating Yak Guru

298 Posts

Posted - 2011-04-22 : 13:50:49
Yes, the dreaded error message:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression

I know why it's doing it, I just can't see how to fix it.
Any suggestions are appriciated....



SELECT
A.CustID, A.UPDATEDBY, A.UPDATEDON, A.UPDATEACTION,
(CASE WHEN (SELECT A.UIC FROM CustInfo A
INNER JOIN MR C ON A.CustID = C.CustID
JOIN FDS B ON C.B_ID = B.B_ID
WHERE B.CLOSED = 0
AND (A.COMMAND = @Command OR @Command = '')
AND (A.RSC = @RSC OR @RSC = '')
AND (A.UIC LIKE '%' + @UIC + '%' OR @UIC = '')) IS NULL THEN 'YES'
ELSE 'NO'END)
AS DOMOD
FROM CustInfo A
WHERE (COMMAND = @Command OR @Command = '')
AND (RSC = @RSC OR @RSC = '')
AND (UIC LIKE '%' + @UIC + '%' OR @UIC = '')


jimf
Master Smack Fu Yak Hacker

2875 Posts

Posted - 2011-04-22 : 13:58:33
Maybe this?
SELECT
A.CustID, A.UPDATEDBY, A.UPDATEDON, A.UPDATEACTION,
CASE WHEN A.UIC is null and B.Closed= 0
THEN 'YES'
ELSE 'NO'
END AS DOMOD
FROM CustInfo A
INNER JOIN MR C ON A.CustID = C.CustID
INNER JOIN JOIN FDS B ON C.B_ID = B.B_ID
WHERE (COMMAND = @Command OR @Command = '')
AND (RSC = @RSC OR @RSC = '')
AND (UIC LIKE '%' + @UIC + '%' OR @UIC = '')

Jim

Everyday I learn something that somebody else already knew
Go to Top of Page

Zath
Constraint Violating Yak Guru

298 Posts

Posted - 2011-04-22 : 14:34:40
A good suggestions and it's getting close but pulling too many records...



SELECT A.UIC, A.CustID, A.UPDATEDON, A.UPDATEACTION,

CASE WHEN (SELECT B.CLOSED
WHERE B.CLOSED = 0 AND C.CustID = A.CustID) IS NULL THEN 'YES'
ELSE 'NO' END
AS DOMOD

FROM CustInfo A
INNER JOIN MR C ON A.CustID = C.CustID
INNER JOIN FDS B ON C.B_ID = B.B_ID
WHERE (COMMAND = @Command OR @Command = '')
AND (RSC = @RSC OR @RSC = '')
AND (UIC LIKE '%' + @UIC + '%' OR @UIC = '')



This is the original sproc I inherited and wanted to search on all params and clean it up and I'm sure you can see why.........



IF @VALUE1 = 'A'
BEGIN

SELECT
A.UIC, COUNT(*) as [NUMREQ] INTO #TEMPC
FROM CustInfo A
INNER JOIN MR C ON A.CustID = C.CustID
JOIN SDB_3C B ON C.B_ID = B.B_ID
WHERE B.CLOSED = 0
AND A.COMMAND = @VALUE2
GROUP BY A.UIC

SELECT
CustID
, COMMAND
, UIC
, UPDATEACTION INTO #TEMPC1
FROM CustInfo
WHERE COMMAND = @VALUE2

ALTER TABLE #TEMPC1
ADD DOMOD CHAR(3)

UPDATE #TEMPC1
SET DOMOD = 'NO'
WHERE UIC IN (SELECT UIC FROM #TEMPC)

UPDATE #TEMPC1
SET DOMOD = 'YES'
WHERE DOMOD IS NULL

SELECT * FROM #TEMPC1
DROP TABLE #TEMPC1
DROP TABLE #TEMPC

END

IF @VALUE1 = 'B' --RSC SEARCH
BEGIN

SELECT
A.UIC
, COUNT(*) as [NUMREQ] INTO #TEMP
FROM CustInfo A
INNER JOIN MR C
ON A.CustID = C.CustID
JOIN SDB_3C B
ON C.B_ID = B.B_ID
WHERE B.CLOSED = 0
AND A.RSC = @VALUE2
GROUP BY A.UIC


SELECT
CustID
, COMMAND
, UIC
, UPDATEACTION INTO #TEMP1
FROM CustInfo
WHERE RSC = @VALUE2

ALTER TABLE #TEMP1
ADD DOMOD CHAR(3)

UPDATE #TEMP1
SET DOMOD = 'NO'
WHERE UIC IN (SELECT UIC FROM #TEMP)

UPDATE #TEMP1
SET DOMOD = 'YES'
WHERE DOMOD IS NULL

SELECT * FROM #TEMP1

DROP TABLE #TEMP1
DROP TABLE #TEMP

END

IF @VALUE1 = 'C'
BEGIN

SELECT
A.UIC
, COUNT(*) as [NUMREQ] INTO #TEMPU
FROM CustInfo A
INNER JOIN MR C
ON A.CustID = C.CustID
INNER JOIN SDB_3C B
ON C.B_ID = B.B_ID
WHERE B.CLOSED = 0
AND UIC LIKE '%' + @VALUE2 + '%'
GROUP BY A.UIC

SELECT
CustID
, COMMAND
, UIC
, UPDATEACTION INTO #TEMPU1
FROM CustInfo
WHERE UIC LIKE '%' + @VALUE2 + '%'

ALTER TABLE #TEMPU1
ADD DOMOD CHAR(3)

UPDATE #TEMPU1
SET DOMOD = 'NO'
WHERE UIC IN (SELECT UIC FROM #TEMPU)

UPDATE #TEMPU1
SET DOMOD = 'YES'
WHERE DOMOD IS NULL

SELECT * FROM #TEMPU1

DROP TABLE #TEMPU1
DROP TABLE #TEMPU
END




Go to Top of Page

jimf
Master Smack Fu Yak Hacker

2875 Posts

Posted - 2011-04-22 : 14:57:38
This doesn't make any sense
SELECT B.CLOSED
WHERE B.CLOSED = 0 AND C.CustID = A.CustID) IS NULL

that's just always 0.
But obviously, you're still getting back more than one value if you tried my code and got the same error, so maybe you're mising a join. You could always add a distinct to the select and see if that still returns more than value. If it does, you will have to determine a tie breaker so that ionly returns one value.

Jim

Everyday I learn something that somebody else already knew
Go to Top of Page
   

- Advertisement -