Это не разрешено, когда подзапрос следует за подзапросом, возвращающим более 1 значения

У меня возникли проблемы с возвратом значений в процент контрольного списка столбцов. Это дает ошибку «Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует за =, !=». Представленные таблицы являются просто образцом из тысяч строк, которые имеют много оценок.

Таблиц 2, и я извлек этот образец из тысяч строк:

╔═════════╦═══════════════╗    
║ id      ║ value_integer ║
╠═════════╬═══════════════╣   
║ 2059064 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2064435 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2064889 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2064893 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2086272 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2134036 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2163046 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2175279 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2175279 ║ NULL          ║
╠═════════╬═══════════════╣
║ 2186928 ║ NULL          ║
╠═════════╬═══════════════╣

вторая таблица:

╔═════════╦════════════╗
║ id      ║ evaluation ║
╠═════════╬════════════╣
║ 2059064 ║ 0          ║
╠═════════╬════════════╣
║ 2064435 ║ 0          ║
╠═════════╬════════════╣
║ 2064889 ║ 0          ║
╠═════════╬════════════╣
║ 2064893 ║ 0          ║
╠═════════╬════════════╣
║ 2086272 ║ 50001      ║
╠═════════╬════════════╣
║ 2128447 ║ 0          ║
╠═════════╬════════════╣
║ 2128447 ║ 0          ║
╠═════════╬════════════╣
║ 2128447 ║ 50001      ║
╠═════════╬════════════╣
║ 2134036 ║ 50001      ║
╠═════════╬════════════╣
║ 2163046 ║ 50001      ║
╠═════════╬════════════╣
║ 2175279 ║ 50006      ║
╠═════════╬════════════╣
║ 2175279 ║ 50001      ║
╠═════════╬════════════╣
║ 2186928 ║ 50004      ║
╠═════════╬════════════╣
║ 2190848 ║ 50001      ║
╠═════════╬════════════╣
║ 2190848 ║ 0          ║
╠═════════╬════════════╣
║ 2190848 ║ 0          ║
╠═════════╬════════════╣
║ 2190848 ║ 1          ║
╠═════════╬════════════╣
║ 2190848 ║ 1          ║
╠═════════╬════════════╣
║ 2222107 ║ 1          ║
╠═════════╬════════════╣
║ 2250093 ║ 1          ║
╠═════════╬════════════╣
║ 2250093 ║ 1          ║
╠═════════╬════════════╣
║ 2250093 ║ 50005      ║
╠═════════╬════════════╣
║ 2250093 ║ 0          ║
╠═════════╬════════════╣
╚═════════╩════════════╝

Цель состоит в том, чтобы рассчитать процент выбранной оценки / общей оценки. Оценка 50001 — да, а 0 и 1 означают, что не оценивались или не выбирались соответственно.

 UPDATE DB.D_ENERGY_REFERENCE
    SET D_ENERGY_REFERENCE.VALUE_INTEGER = (SELECT  (SELECT CAST(COUNT(EVALUATION) AS FLOAT)
                                                     FROM DB.D_CHECK_LIST D_CHECK_LIST
                                                     WHERE D_CHECK_LIST.EVALUATION  = 50001
                                                     GROUP BY ID) / (SELECT CAST(COUNT(EVALUATION) AS FLOAT)
                                                                     FROM DB.D_CHECK_LIST D_CHECK_LIST
                                                                     WHERE D_CHECK_LIST.EVALUATION  NOT IN (0,1)
                                                                     GROUP BY ID) * 100
                                            FROM DB.D_CHECK_LIST D_CHECK_LIST 
                                            WHERE D_CHECK_LIST.ID IN (SELECT ID
                                                                      FROM DB.D_ENERGY_REFERENCE  
                                                                      WHERE ID = D_CHECK_LIST.ID))

Один из ваших подзапросов возвращает более одной записи. Попробуйте запустить их отдельно, и вы найдете свою проблему.

Doug Coats 27.05.2019 16:46

Я сделал и застрял. Он дает значение в отдельном операторе select

great77 27.05.2019 16:46

Вы оба пробовали? Вложенный и внешний?

Doug Coats 27.05.2019 16:51

Если мы поместим туда табуляцию, мы увидим, что yuio даже не закрывает все скобки. Но этот подзапрос определенно вернет несколько строк, так как он возвращает строку для каждого значения ID в таблице D_CHECK_LIST, которая также находится в таблице D_ENERGY_REFERENCE. Возможно, вам лучше показать свои данные и ожидаемые результаты здесь.

Larnu 27.05.2019 16:52

Наверное дело в UPDATE .. FROM .. JOIN ..

Serg 27.05.2019 16:56

Я опустил закрывающую скобку, она есть в коде. Я положил его туда. Все тот же результат

great77 27.05.2019 17:00

Чем больше я смотрю на запрос, тем больше я не понимаю, какова его цель. Я даже не осознавал до сих пор, но подзапросы в подзапросе даже вернут несколько строк, так как есть GROUP BY на ID. Ни один из этих запросов не использует боковое соединение для ограничения возвращаемых результатов, поэтому я на самом деле понятия не имею, что делает OP на этом этапе.

Larnu 27.05.2019 17:04

Вы должны попробовать свои предложения по одному и убедиться, что каждое из них дает вам только один результат. Я думаю, что SELECT ID FROM DB.D_ENERGY_REFERENCE WHERE ID = D_CHECK_LIST.ID дает вам более 1 строки, потому что вы используете его с «IN» вместо «=»

Antonio Veneroso Contreras 27.05.2019 17:17

@Ламу. Я отправлю образец таблицы для вас, чтобы увидеть позже.

great77 27.05.2019 17:32

@Lamu я поставил образец таблицы

great77 27.05.2019 19:28
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
10
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я думаю, вы ищете сценарий обновления, как показано ниже:

Примечание: Сначала попробуйте с тестовыми данными.

UPDATE T
SET T.VALUE_INTEGER = A.Val
FROM D_ENERGY_REFERENCE T
INNER JOIN 
(
    SELECT 
    ID,
    CASE 
        WHEN CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION  NOT IN (0,1) THEN EVALUATION ELSE NULL END) AS FLOAT) = 0 THEN 0
        ELSE
        (
            CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION  = 50001 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 AS Val
    FROM D_CHECK_LIST
    GROUP BY ID
)A ON T.ID = A.ID

У МЕНЯ ОШИБКА Неправильный синтаксис рядом с ')'. AT LINE 9 CASE WHEN D_CHECK_LIST.EVALUATION = 50001 THEN EVALUATION ELSE NULL)

great77 27.05.2019 22:56

к сожалению, оператор CASE не был завершен должным образом. Пожалуйста, попробуйте сейчас.

mkRabbani 27.05.2019 23:04

Спасибо. Теперь ошибка «Делить на ноль».

great77 27.05.2019 23:14

С этим можно легко справиться.

mkRabbani 27.05.2019 23:14

Да, я попробую ноль, если

great77 27.05.2019 23:18

Спасибо. Работает как положено. Ваше здоровье

great77 27.05.2019 23:26

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