Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
Georgiy L.
Member

Откуда:
Сообщений: 376
Делаю встроенную процедуру:

PROCEDURE dbo.agprot_GetQuestionCountsFor_Teacher
	@login nvarchar(50),
	@count0 int OUTPUT
AS

SELECT @count0 = COUNT(id)
FROM question
WHERE status = 0 AND subject_id =
(
SELECT subj_id
FROM teacher_subj
WHERE login = @login
)

Запускаю, говорит

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

Не пойму про какие несколько значений он говорит, ведь мне нужно посчитать кол-во элементов.

Помогите плиз.
31 авг 06, 08:37    [3074514]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery  [new]
voronin_mg
Member

Откуда: Северо-юг :) западной сибири
Сообщений: 37
Georgiy L.
Делаю встроенную процедуру:

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

Не пойму про какие несколько значений он говорит, ведь мне нужно посчитать кол-во элементов.

Помогите плиз.


SELECT subj_id
FROM teacher_subj
WHERE login = @login

Данный подзапрос возвращает более 1-го значения по какому-то ID.
используйте select distinct ... или group by...
31 авг 06, 08:47    [3074530]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery  [new]
Georgiy L.
Member

Откуда:
Сообщений: 376
voronin_mg
Georgiy L.
Делаю встроенную процедуру:

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

Не пойму про какие несколько значений он говорит, ведь мне нужно посчитать кол-во элементов.

Помогите плиз.


SELECT subj_id
FROM teacher_subj
WHERE login = @login

Данный подзапрос возвращает более 1-го значения по какому-то ID.
используйте select distinct ... или group by...


А мне и нужно более 1 значения, подскажите плиз синтаксис чуть подробнее.
Нужно подсчитать кол-во записей, где совпадают subject_id и subj_id
31 авг 06, 08:51    [3074538]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
Taffy
Member

Откуда:
Сообщений: 20501
Если Вы на MS SQL, то у Вас есть джойны
SELECT @count0 = COUNT(id)
FROM question q inner join
         teacher_subj s on q.subject_id = s.subj_id 
WHERE q.status = 0 and 
          s.login = @login
31 авг 06, 08:59    [3074555]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery  [new]
voronin_mg
Member

Откуда: Северо-юг :) западной сибири
Сообщений: 37
Georgiy L.

А мне и нужно более 1 значения, подскажите плиз синтаксис чуть подробнее.
Нужно подсчитать кол-во записей, где совпадают subject_id и subj_id


Тогда используйте предикат IN...

SELECT @count0 = COUNT(id)
FROM question
WHERE status = 0 AND subject_id IN
(
SELECT subj_id
FROM teacher_subj
WHERE login = @login
)

или Join

SELECT COUNT(q.id)
FROM question q
join teacher_subj t on t.subj_id = q.subject_id
where q.status = 0 and t.login = @login
31 авг 06, 09:02    [3074559]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
Georgiy L.
Member

Откуда:
Сообщений: 376
ОК, Работает!!!
Огромное спасибо!
31 авг 06, 09:06    [3074568]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
очередной_студент
Guest
У меня тоже проблема с этой ошибкой, только в другом виде, есть такой триггер:

use SuperMarket
go
-- 1) если удаляю гардиана, то удалить его и из гардактивити
CREATE TRIGGER delete_guardian
ON Stuffs
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
if (select Post from deleted) = 'GUARD'
DELETE FROM GuardsActivity
WHERE guardianID = (select EmployeID from deleted)
END
GO

Таблицы:
CREATE TABLE Stuffs(
EmployeID int IDENTITY NOT NULL,
FirstName varchar(30) NOT NULL,
LastName varchar(30) NOT NULL,
Adress varchar(30) NULL,
PhoneNo varchar(15) CHECK (PhoneNo LIKE '(0[0-9][0-9])[1-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]') NULL,
Post varchar(10) CHECK (Post IN ('DIRECTOR', 'MANAGER', 'FINANCIST', 'GUARD', 'CASHIER', 'CONSULTANT')) NOT NULL,
Subordinates int DEFAULT 0
CONSTRAINT PK_Stuffs PRIMARY KEY (EmployeID)
)

CREATE TABLE GuardsActivity(
guardianID int NOT NULL,
incidentPrevent int NOT NULL FOREIGN KEY REFERENCES Incidents(IncidentID),
dateof datetime NOT NULL
)

При попытке протестировать триггер :
use SuperMarket;
go
SET STATISTICS TIME ON
Delete from Stuffs where Post = 'GUARD'
SET STATISTICS TIME OFF

Пишет ту же ошибку:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Msg 512, Level 16, State 1, Procedure delete_guardian, Line 8
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.

Без триггера - удаляет успешно, то есть моя ошибка именно в нём.. подскажите пожалуйста.
2 апр 12, 23:14    [12354233]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
очередной_студент
подскажите пожалуйста.
Подсказываю -- псевдотаблицы inserted и deleted могут содержать более одной строки.
2 апр 12, 23:51    [12354338]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
очередной_студент
Guest
invm, ох, точно! я посмотрел, у меня действительно получается 2 записи в этой псевдо-таблице... а как мне тогда по одному выбирать из таблицы deleted ID тех сотрудников, которых нужно удалить из другой таблицы?
3 апр 12, 10:32    [12355307]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
iljy
Member

Откуда:
Сообщений: 8711
очередной_студент
invm, ох, точно! я посмотрел, у меня действительно получается 2 записи в этой псевдо-таблице... а как мне тогда по одному выбирать из таблицы deleted ID тех сотрудников, которых нужно удалить из другой таблицы?

Этого делать не надо. Скуль - язык обработки множеств, соответственно со множествами и работайте. Есть JOIN, есть IN, изучайте.
3 апр 12, 10:40    [12355355]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
очередной_студент
Guest
iljy, спасибо, но почему-то опять та же ошибка( я что-то неправильно понимаю видать..

if (select Post from deleted) = 'GUARD'
DELETE FROM GuardsActivity
WHERE guardianID IN (select EmployeID from deleted)


казалось бы, всё правильно, в примерах на IN есть такое:
SELECT *
FROM Salespeople
WHERE city IN ('Barcelona', 'London');


С джоином та же история.. видать я не понимаю, как до конца работает конструкция DELETE?
3 апр 12, 10:55    [12355456]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
очередной_студент,
Вы неправильно понимаете как работает конструкция if
3 апр 12, 10:58    [12355480]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
iljy
Member

Откуда:
Сообщений: 8711
очередной_студент
iljy, спасибо, но почему-то опять та же ошибка( я что-то неправильно понимаю видать..

if (select Post from deleted) = 'GUARD'
DELETE FROM GuardsActivity
WHERE guardianID IN (select EmployeID from deleted)


казалось бы, всё правильно, в примерах на IN есть такое:
SELECT *
FROM Salespeople
WHERE city IN ('Barcelona', 'London');


С джоином та же история.. видать я не понимаю, как до конца работает конструкция DELETE?
3 апр 12, 10:59    [12355483]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
очередной_студент
Guest
так тоже не работает...
if (select Post from deleted) IN ('GUARD')
DELETE FROM GuardsActivity
FROM GuardsActivity g join deleted d on g.guardianID = d.EmployeID
where g.guardianID > 0;
3 апр 12, 11:06    [12355530]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
очередной_студент,


а что вы хотите этим условием выразить? с учетом того, что в deleted несколько строк
очередной_студент
if (select Post from deleted) = 'GUARD' ...
if (select Post from deleted) IN ('GUARD') ...

3 апр 12, 11:12    [12355553]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
iljy
Member

Откуда:
Сообщений: 8711
очередной_студент,

DELETE FROM GuardsActivity
FROM GuardsActivity g join deleted d on g.guardianID = d.EmployeID
where g.guardianID > 0 and d.Post = 'GUARD'

IF уберите совсем.
3 апр 12, 11:15    [12355569]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Shakill
очередной_студент,


а что вы хотите этим условием выразить? с учетом того, что в deleted несколько строк
очередной_студент
if (select Post from deleted) = 'GUARD' ...
if (select Post from deleted) IN ('GUARD') ...

Не так:
IF EXISTS(SELECT * FROM deleted WHERE Post IN('GUARD','...',...))
Но в данном случае вместо IF напрашивается соответствующее условие в DELETE
Хотя, не знаю, что вообще требуется?
3 апр 12, 11:17    [12355584]     Ответить | Цитировать Сообщить модератору
 Re: Ругается: Subquery returned more than 1 value. This is not permitted when the subquery fol  [new]
очередной_студент
Guest
Shakill, условием я хочу ограничить действие триггера только на удаление тех стаффов, которые относятся к должности охранника, но я уже понял ошибку.)


iljy,
автор
IF уберите совсем.
спасибо, это идеальный вариант, чего-то не додумался.. привычка из обычных языков программирования ифы тыкать, и да - заработало!))
3 апр 12, 11:27    [12355648]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить