Подзапрос SQL возвратил более 1 значения из оператора if else

Это заявление одной из моих хранимых процедур.

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 значения. Как я могу делать то, что мне нужно, без этой проверки? Я пытался использовать содержит, но не знаю, как использовать его с конкретной таблицей с условием

MySQL <> TSQL. Пожалуйста, укажите, какую СУБД вы используете?

Madhur Bhaiya 05.11.2018 15:16

ВЫБРАТЬ ТОП 1 ...?

mm8 05.11.2018 15:17

Синтаксис @MadhurBhaiya явно не MySql, а C# и .Net - просто нерелевантные теги, если вы не видите код, которого я не вижу в этом вопросе.

Zohar Peled 05.11.2018 15:18
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть несколько проблем в вашем коде, что затрудняет правильный ответ на ваш вопрос. Я скопировал код, изменил все, что мог, и добавил комментарии всякий раз, когда видел проблему (даже если я ее исправлял). Надеюсь, это поможет.

-- 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 значения? А что касается начального состояния, я делал это, чтобы выполнять разные команды в каждой процедуре, почему это не нормально?

JFC 05.11.2018 15:53

1. не совсем уверен, зачем вам нужно соединение там в первую очередь 2. Внутри предложения values могут быть только переменные или жестко закодированные значения. 3. Лучше иметь разные процедуры для каждой операции crud - одну для вставки, одну для обновления, одну для удаления и одну для выбора.

Zohar Peled 05.11.2018 16:22

Мне нужно там соединение, потому что мне нужно знать, из какой заявки принадлежат файлы в hDados с условием hr.IdColaborador = @IdColaborador. Я просто выполнял процедуру для каждой таблицы с разными командами, потому что именно так они и поступали там, где я работаю.

JFC 05.11.2018 16:31

Другие вопросы по теме