что не так с этим запросом в SQL - PullRequest
1 голос
/ 16 июня 2011

У меня следующий запрос:

UPDATE PRODUCT SET FIXEDCOST = 
   (Select PRICE from PRODUCTPROGRAM 
    where productID = PRODUCTID) * .6 
WHERE FAMILY = 'Services'

Мне нужно обновить поле FIXEDCOST таблицы PRODUCT на 60% от значения Price в таблице PRODUCTPROGRAM.

Таблицы связаны productID.

Ошибка говорит о том, что в подзапросе возвращается более одного. Есть идеи, как я могу это исправить? Заранее спасибо за любую помощь.

Ответы [ 9 ]

2 голосов
/ 16 июня 2011

Укротитель, вы получаете слишком много результатов в "программе выбора цены от гордости", вам нужно сузить ее или сделать что-то вроде этого:

UPDATE PRODUCT A, PRODUCTPROGRAM B   
SET A.FIXEDCOST = B.PRICE * .6 
WHERE A.productID = B.PRODUCTID AND FAMILY ='Services'

Попробуй и дай мне знать. Марсело

1 голос
/ 17 июня 2011
UPDATE PRODUCT SET FIXEDCOST = 
   (Select TOP 1 PRICE from PRODUCTPROGRAM 
    where productID = PRODUCT.PRODUCTID) * .6 
WHERE FAMILY = 'Services'
1 голос
/ 17 июня 2011
UPDATE PRODUCT p
    JOIN PRODUCTPROGRAM pp ON pp.productID = p.productID
SET p.FIXEDCOST = pp.PRICE *.6
WHERE p.FAMILY = 'Services'
1 голос
/ 17 июня 2011

Вложенный запрос вернет все записи из таблицы PRODUCTPROGRAM, поскольку все записи имеют значение PRODUCTID, равное самому себе.

Вы должны указать, что хотите сравнить его со значением в таблице PRODUCT:

UPDATE PRODUCT
SET FIXEDCOST =
  (Select PRICE from PRODUCTPROGRAM 
  where productID = PRODUCT.PRODUCTID) * .6 
WHERE FAMILY = 'Services'
1 голос
/ 16 июня 2011

Хотя я не уверен, что синтаксис равен 100%, вы можете сначала попытаться сослаться на то, какой таблице для каждого идентификатора продукта присвоено значение, т. Е. PRODUCT.productid и PRODUCTPROGRAM.PRODUCTID.

0 голосов
/ 16 июня 2011

Я подозреваю, что утверждение where неверно. Вы имеете в виду, вероятно:

where productID = PRODUCT.PRODUCTID
0 голосов
/ 16 июня 2011

Использовать псевдонимы таблиц, чтобы избежать двусмысленности? Как ОБНОВЛЕНИЕ ПРОДУКТА P УСТАНОВЛЕНО FIXEDCOST = (ВЫБЕРИТЕ ЦЕНУ ИЗ ПРОГРАММЫ ПРОГРАММЫ PP, ГДЕ P.PRODUCTID = PP.PRODUCTID) ...

0 голосов
/ 16 июня 2011

Попробуйте ограничить подзапрос или используйте уникальный ключ в предложении where:

    UPDATE PRODUCT SET FIXEDCOST = 
   (Select PRICE from PRODUCTPROGRAM 
    where productID = PRODUCTID LIMIT 1) * .6 
WHERE FAMILY = 'Services'
0 голосов
/ 16 июня 2011

Ваш подзапрос должен возвращать более одного значения.

Select PRICE from PRODUCTPROGRAM 
where productID = PRODUCTID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...