Это заявление одной из моих хранимых процедур.
IF @Action = 'UPDATE'
BEGIN
IF (Select Nome
From hDados hd
JOIN hRequisicao hr
ON hr.IdReq = hd.IdReq
WHERE hr.IdColaborador = 3
AND IdStatus != 4
AND IdStatus != 5) LIKE @Nome
UPDATE hDados
SET Nome = @Nome,
Dados = @Dados,
Observacoes = @Observacoes
FROM hRequisicao hr, hDados hd
WHERE hr.IdColaborador = @IdColaborador
AND Nome LIKE @Nome
AND IdStatus != 4
AND IdStatus != 5
ELSE
INSERT INTO hDados(Nome,Dados,Observacoes,IdReq)
VALUES (
@Nome,
@Dados,
@Observacoes,
(
Select hr.IdReq
From hRequisicao hr
WHERE hr.IdColaborador = @IdColaborador
AND IdStatus != 4
AND IdStatus != 5
)
)
END
Проблема в том, что мне нужно проверить, существует ли параметр, возвращаемый из приложения, в таблице hDados, используя команду select только там, где IdColaborador = @IdColaborador, но это не работает, потому что он говорит, что возвращает более 1 значения. Как я могу делать то, что мне нужно, без этой проверки? Я пытался использовать содержит, но не знаю, как использовать его с конкретной таблицей с условием
ВЫБРАТЬ ТОП 1 ...?
Синтаксис @MadhurBhaiya явно не MySql, а C# и .Net - просто нерелевантные теги, если вы не видите код, которого я не вижу в этом вопросе.


У вас есть несколько проблем в вашем коде, что затрудняет правильный ответ на ваш вопрос. Я скопировал код, изменил все, что мог, и добавил комментарии всякий раз, когда видел проблему (даже если я ее исправлял). Надеюсь, это поможет.
-- I also don't like this condition, it indicates faulty design of the stored procedure
IF @Action = 'UPDATE' BEGIN
-- use Exists to solve the "subquery returned more than one result" problem
IF EXISTS(
Select 1
From hDados hd
JOIN hRequisicao hr
ON hr.IdReq = hd.IdReq
WHERE hr.IdColaborador = 3
AND IdStatus != 4
AND IdStatus != 5
AND Nome LIKE @Nome
) BEGIN
UPDATE hDados -- use the alias you've used in the from clause
SET Nome = @Nome,
Dados = @Dados,
Observacoes = @Observacoes
-- From clause problem: You are creating a cross join between hRequisicao and hDados tables.
-- use proper join syntax.
FROM hRequisicao hr, hDados hd
WHERE hr.IdColaborador = @IdColaborador
AND Nome LIKE @Nome
AND IdStatus != 4
AND IdStatus != 5
END
END ELSE BEGIN
-- You can't use a select statement inside the values clause.
/*
INSERT INTO hDados(Nome,Dados,Observacoes,IdReq)
VALUES (
@Nome,
@Dados,
@Observacoes,
(
Select
)
)
*/
-- Instead, use insert...select: (Note that this select statement might also return multiple rows!)
INSERT INTO hDados(Nome,Dados,Observacoes,IdReq)
SELECT @Nome, @Dados, @Observacoes, hr.IdReq
FROM hRequisicao hr
WHERE hr.IdColaborador = @IdColaborador
AND IdStatus != 4
AND IdStatus != 5
END
Спасибо за исправление, по какой-то причине, когда я попытался использовать правильный синтаксис JOIN в заявлении об обновлении, он не работал, поэтому я пошел с этим и все же выполнил свою работу. Также почему мне не использовать оператор Select внутри значений, если он мне нужен только для возврата 1 значения? А что касается начального состояния, я делал это, чтобы выполнять разные команды в каждой процедуре, почему это не нормально?
1. не совсем уверен, зачем вам нужно соединение там в первую очередь 2. Внутри предложения values могут быть только переменные или жестко закодированные значения. 3. Лучше иметь разные процедуры для каждой операции crud - одну для вставки, одну для обновления, одну для удаления и одну для выбора.
Мне нужно там соединение, потому что мне нужно знать, из какой заявки принадлежат файлы в hDados с условием hr.IdColaborador = @IdColaborador. Я просто выполнял процедуру для каждой таблицы с разными командами, потому что именно так они и поступали там, где я работаю.
MySQL <> TSQL. Пожалуйста, укажите, какую СУБД вы используете?