Сообщение об ошибке подзапроса при выполнении запроса

UPDATE rm 
SET rm.cost_sqft = ISNULL((SELECT 
                               CASE 
                                  WHEN (rm.rm_cat IN ('8','NON-REPORT') AND rm.space_fee = 'No') 
                                     THEN '0' 
                                     ELSE rent_w.w * @rental_rate 
                               END
                           FROM 
                               @rental_weight AS rent_w, bl, rm          
                           WHERE 
                               rm.main_contact = rent_w.space_type
                               AND rm.description = rent_w.space_quality
                               AND bl.cost_type = rent_w.campuse_cost       
                               AND bl.bl_id = rm.bl_id),'0') 
WHERE rm.bl_id = @bl_id
  AND rm.fl_id = @fl_id
  AND rm.rm_id = @rm_id 

При выполнении этого оператора я получаю эту ошибку:

Сообщение 512, уровень 16, состояние 1, процедура icat_rm_cost_sqft, строка 100 [строка запуска пакета 2]
Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует за =, !=, ‹, ‹= , >, >= или когда подзапрос используется как выражение.


person Abhilasha Joshi    schedule 09.05.2019    source источник
comment
Какая часть сообщения вам не понятна? В вашем запросе есть один подзапрос, и сообщение кажется ясным.   -  person Gordon Linoff    schedule 09.05.2019
comment
что не так в коде? Почему я получаю это сообщение об ошибке?   -  person Abhilasha Joshi    schedule 09.05.2019
comment
Этот вопрос было бы легче читать, если бы вы начали с небольшого введения. См. Как задать хороший вопрос   -  person GMc    schedule 09.05.2019
comment
Вредные привычки, от которых следует избавиться: использование СОЕДИНЕНИЯ старого стиля — этот старый стиль разделенного запятыми списка таблиц был заменен правильным синтаксисом ANSI JOIN в ANSI-92. Стандарт SQL (более 25 лет назад), и его использование не рекомендуется   -  person marc_s    schedule 09.05.2019


Ответы (1)


Ошибка означает, что подзапрос (выбор) возвращает более одной строки для данного ключа, который будет применен к обновлению.

Рассмотрим сценарий, в котором обновление становится чем-то вроде этого очень надуманного сценария:

Пример данных в таблице Customer:

cust_id   cust_type     name
1          X            Fred
1          Y            jack

И запрос, который будет генерировать ошибку:

update customer
    set name = (
           select "MR " || name
           from customer
           where cust_id = 1 /* returns Fred and Jack */
        )
    where cust_id = 1 and cust_type = 'X';

На какое имя следует обновить клиента 1X? "Мистер Фред" или "Мистер Джек"? СУБД не может решить за вас, вам нужно изменить запрос как коррелированный подзапрос (добавить условие соединения для cust_type) или подзапрос, который просто возвращает одну строку.

Конечно, вышеизложенное очень надумано, но именно об этом говорит вам ошибка.

person GMc    schedule 09.05.2019
comment
@Abhilasha_Joshi, если это помогло вам, не могли бы вы принять ответ (нажмите на серую галочку рядом с ответом) и проголосовать за него? Спасибо. - person GMc; 13.05.2019