SQL возвращает более 1 значения запроса - PullRequest
0 голосов
/ 29 мая 2019

У меня проблема с обновлением или вставкой столбца в зависимости от условия.Я хочу иметь возможность вставить переменную, если ссылочный номер ранее не существовал в таблице, и если он существует, то он должен обновить.Мой вопрос заключается в том, что @checklistscore возвращает более одной строки.Когда я выбрал @checklistscore, он выдает ту же ошибку.Как я могу решить это

  SET XACT_ABORT ON; 
DECLARE @TRANSACTION VARCHAR(20) = 'EXAMPLE';
BEGIN TRAN @TRANSACTION
DECLARE @checklistscore INT;

SET @checklistscore = (SELECT 
      CASE 
        WHEN CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION  NOT IN (0,1) THEN EVALUATION ELSE NULL END) AS FLOAT) = 0 THEN NULL
        ELSE
        (
          CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION  IN (2, 3, 50001, 50003, 50004, 50005, 50006, 50020, 50027, 50028) THEN EVALUATION ELSE NULL END) AS FLOAT)
            /
            CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION  NOT IN (0,1) THEN EVALUATION ELSE NULL END) AS FLOAT)
        ) * 100 

    END  FROM DB.D_CHECK_LIST   INNER JOIN DB.D_ENERGY_REFERENCE ON  D_CHECK_LIST.ID =D_ENERGY_REFERENCE.ID AND D_ENERGY_REFERENCE.REFERENCE = 19051
    GROUP BY D_CHECK_LIST.ID)

BEGIN

IF
    /* CHECKLIST TO UPDATE*/
    (EXISTS     
        (SELECT *
        FROM    DB.D_ENERGY_REFERENCE D_ENERGY_REFERENCE
                ,DB.D_CHECK_LIST D_CHECK_LIST
        WHERE   D_ENERGY_REFERENCE.ID = D_CHECK_LIST.ID
        AND     D_ENERGY_REFERENCE.REFERENCE = 19051


        )
)

BEGIN   
UPDATE DB.D_ENERGY_REFERENCE 
SET D_ENERGY_REFERENCE.VALUE_INTEGER =  @checklistscore 
FROM DB.D_ENERGY_REFERENCE
INNER JOIN DB.D_CHECK_LIST D_CHECK_LIST ON D_ENERGY_REFERENCE.ID = D_CHECK_LIST.ID
WHERE  D_ENERGY_REFERENCE.REFERENCE = 19051



END

ELSE 

BEGIN 

INSERT INTO DB.D_ENERGY_REFERENCE(ID, REFERENCE_NO, REFERENCE,VALUE_INTEGER)
(SELECT ID, 
                (SELECT  ISNULL(MAX(REFERENCE_NO), 0) + 1 FROM DB.D_ENERGY_REFERENCE),
                19051,  @checklistscore 

FROM DB.D_ENERGY_REFERENCE D_ENERGY_REFERENCE

GROUP BY D_ENERGY_REFERENCE.ID
)

END

1 Ответ

1 голос
/ 31 мая 2019

Я думаю, что вам нужно будет заменить вашу переменную временной таблицей. Временная таблица может хранить 1 строку для каждого идентификатора. Затем ваша вторая половина вашего сценария захочет соединиться с временной таблицей, используя ID в качестве условия соединения, и обновить каждую строку таким образом.

(Перенес мой комментарий в качестве предлагаемого ответа.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...