I am encountering a problem of doing calculation between table in multiple rows.
This is my code:
UPDATE StockList
SET stkQuantity = stkQuantity - (SELECT quantity FROM mCalculate)
WHERE stkID = (SELECT stkID FROM mCalculate)
If table mCalculate has only one row of data, the calculation in StockList is successfully, but if table mCalculate has multiple rows of data, I get an error:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Can anyone help me solve this problem and explain to me what's the problem I am having?
Image to refer:
Window:
Database:
You have to use join instead of sub query in this case
UPDATE S
SET stkQuantity = stkQuantity - M.quantity
From stocklist s
Join mcalculate m
On s.stkid = m.stkid
Among other issues, this line here:
WHERE stkID = (SELECT stkID FROM mCalculate)
The = needs a single value, so unless your mCalculate table has only 1 row you will be getting errors.
Your error of: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. is most likely due to the WHERE clause.
Your sub-select
(SELECT quantity FROM mCalculate)
Needs a WHERE clause that ensures this select returns only one row. Ditto for this:
(SELECT stkID FROM mCalculate)
Without the SCHEMA definitions for these tables, it's hard to help you figure out exactly what that WHERE clause should be.
Related
I am trying to dynamically change field value using a select query based on the person's previous room number.
Below are the data sample and the query I have tried. But it is throwing an error saying that there are multiple values returned by the inner query.
,A.[Room],A.[CSR],A.[MemberShip],A.[NatCode]
,A.[MarketCode],A.[Adult],A.[Children],A.[ArrDate]
,A.[DepDate],A.[ResvStatus], CASE WHEN A.[Room]>9000 THEN (SELECT MIN(A.[Room])FROM [RESDETAILS] C WHERE C.GuestName=A.GuestName) ELSE A.[Room] END AS [Room]
FROM [ITHAAFUSHI].[dbo].[RESDETAILS] A
WHERE [GuestName]= 'Mr Jobin Joseph'
GROUP BY
A.[BusinessDate],A.[GuestName],A.[TravelAgent]
,A.[Room],A.[CSR],A.[MemberShip],A.[NatCode]
,A.[MarketCode],A.[Adult],A.[Children],A.[ArrDate]
,A.[DepDate],A.[ResvStatus]
"Subquery returned more than 1 value. This is not permitted when the
subquery follows =, !=, <, < =,>, >= or when the subquery is used as
an expression."
Below is the expected result when Room No is >9000
Your (SELECT MIN(A.[Room])FROM [RESDETAILS] C WHERE C.GuestName=A.GuestName)
return more than 1 row so you need to use group by inside :
SELECT MIN(A.[Room])FROM [RESDETAILS] C WHERE C.GuestName=A.GuestName GROUP BY C.GuestName)
I know this title isn't the best one, but i couldn't formulate a better one.
I have a function similar to STRING_SPLIT(), which return a single-column table with one row per split. What i need to do is keep the values from the other columns the same in the new rows.
I have a #TEMP Table with many lines like the following one:
INSERT INTO #TEMP([A], [ToSplit], [C], [D]) SELECT '549618', 'AAA, BBB', '1.7', '6'
I want to turn that line into two lines, one with AAA, the other with BBB, with the other values remaining equal.
I tried in the select list:
SELECT *, (SELECT * FROM [dbo].[ufn_split](ToSplit,',')) FROM #TEMP
ERROR: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Then as a condition (i used IN because it's the only that allow subqueries):
SELECT A, ToSplit FROM #TEMP
WHERE ToSplit IN (SELECT * FROM [dbo].[ufn_split](ToSplit,','))
No errors, but it only returns the rows that don't need the split. It would only work with LIKE, which is not allowed.
So i tried to put a subquery inside the method to create a single column table with one split value per row, that i would go row by row, use `LIKE %ToSplit% on the #TEMP, but again, subqueries not allowed.
SELECT * FROM [dbo].[ufn_split]((SELECT ToSplit FROM #TEMP),',')
ERROR: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
My question is, how can i split the values in ToSplit and keep the other columns values?
Please try like this .use CROSS APPLY
SELECT *
FROM #TEMP
CROSS APPLY
(
SELECT * FROM [dbo].[ufn_split](ToSplit,',')
)u
that will work on SQL SERVER 2016 and to unlimited values.
SELECT
t.*, LTRIM([value])
FROM #TEMP t
CROSS APPLY string_split([ToSplit], ',')
INSERT INTO tbl_vacancy_poojai
(vc_serial_no,vc_poojai_name,vc_poojai_amount,vc_poojai_time,
vc_book_date,vc_vacancy,vc_bok_poj,vc_type,vc_block)
VALUES (
(SELECT vc_serial_no FROM tbl_tot_vacancy_poojai),
(SELECT vc_poojai_name FROM tbl_tot_vacancy_poojai),
(SELECT vc_poojai_amount FROM tbl_tot_vacancy_poojai),
(SELECT vc_poojai_time FROM tbl_tot_vacancy_poojai),
'04/02/2018',
(SELECT vc_vacancy FROM tbl_tot_vacancy_poojai),
('04/02/2018'+(SELECT vc_serial_no FROM tbl_tot_vacancy_poojai)),
(SELECT vc_type FROM tbl_tot_vacancy_poojai),1)
Subquery returned more than 1 value. This is not permitted when the
subquery follows =, !=, <, <= , >, >= or when the subquery is used as
an expression.**strong text
Can anyone guide me to solve this?
Good try. This is more like what you want:
INSERT INTO tbl_vacancy_poojai
(vc_serial_no,vc_poojai_name,vc_poojai_amount,vc_poojai_time,
vc_book_date,vc_vacancy,vc_bok_poj,vc_type,vc_block)
SELECT vc_serial_no,vc_poojai_name,vc_poojai_amount,
vc_poojai_time '04/02/2018',vc_vacancy,
'04/02/2018'+vc_serial_no,vc_type
FROM tbl_tot_vacancy_poojai
'04/02/2018'+vc_serial_no might not do what you think it does
The error occurred because of your select query returns more than one row. you need to select one record only to insert from the sub query. So specify the where condition or use select top 1.
I have a table which has a lot of SSN's and that needs to be passed to a UDF that would validate it and say if its valid or not.
For example, when I execute the following query I get an error:
SELECT [dbo].[f_Is_Valid_SSN_Regex]( (select SSN from dbo.table_name))
The error that I get
Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
I dont think this requires a cursor (I would hate to have that), but is there a way to validate all the records on that column using this function?
Thanks,
RV
You would use a regular select for this:
SELECT SSN, [dbo].f_Is_Valid_SSN_Regex(SSN)
from dbo.table_name;
If you want to see if all of them pass, then use aggregation:
SELECT MIN(dbo.f_Is_Valid_SSN_Regex(SSN))
from dbo.table_name;
If the function return 0 for fails and 1 for passes, then this will return 1 only if all pass.
I have two tables and I want to update one row from GROUP BY data
This is my code:
2nd code:
UPDATE [TABLE].[dbo].[Movies]
SET [NumFrames] =
(SELECT COUNT(ImageURL) as "Count"
FROM [TABLE].[dbo].[Frames]
GROUP BY Movie_Id)
GO
1st code:
(SELECT COUNT(ImageURL) as "Count"
FROM [TABLE].[dbo].[Frames]
GROUP BY Movie_Id
1st code give me a row with numbers
Count
12
6
10
10
10
I want to insert it into Movies.NumFrames
2nd code give me an Error
Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1
value. This is not permitted when the subquery follows =, !=, <, <=
, >, >= or when the subquery is used as an expression.
Please help
I'm sure it's simple
You need to use a WHERE-clause (GROUP BY is not necessary any more).
Otherwise your sub-query returns one row for each Movie_Id, so you have more than one row to use as source for your update.
UPDATE [TABLE].[dbo].[Movies]
SET [NumFrames] =
( SELECT COUNT(ImageURL) as "Count"
FROM [TABLE].[dbo].[Frames]
WHERE [TABLE].[dbo].[Frames].Movie_Id = [TABLE].[dbo].[Movies].Movie_Id
)