Как обновить полевые усилители, когда толщина находится между 'xxx' - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь следовать правилам нормализации при разработке таблиц. Для этого запроса я пытаюсь обновить settings.amps (в несколько строк) до значения, когда толщина находится в диапазоне, в данном случае от 5 до 10 вкл.

table structure

Я могу правильно выбрать все строки setting.id с помощью оператора select, но при попытке преобразовать его в оператор обновления появляется сообщение об ошибке, близкой к

этот запрос правильно выбирает строки, после которых я

SELECT
    s.id AS setting_id,
    s.amps AS setting_amps
FROM
    setting AS s
JOIN materials AS m ON
    s.material_id = m.id
JOIN material_thickness AS mt ON
    m.thickness_id = mt.id
WHERE
    mt.thickness BETWEEN 5 AND 10

это попытка обновления

UPDATE
    setting
SET
    amps = 65
FROM
    setting AS s
JOIN materials AS m ON
    s.material_id = m.id
JOIN material_thickness AS mt ON
    m.thickness_id = mt.id
WHERE
    mt.thickness BETWEEN 5 AND 10

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

Нельзя использовать объединения в операторе UPDATE в SQLite.Вы можете сделать что-то вроде этого:

UPDATE setting
SET amps = 65
WHERE EXISTS (
  SELECT 1 FROM materials AS m   
  JOIN material_thickness AS mt 
  ON m.thickness_id = mt.id
  WHERE
    m.id = setting.material_id
    AND
    mt.thickness BETWEEN 5 AND 10
)

Вы используете EXISTS, чтобы проверить, должна ли быть обновлена ​​строка.

0 голосов
/ 19 мая 2019

Вы можете использовать коррелированный подзапрос ( Учитывая фиксированное постоянное значение 65 )

UPDATE
    setting
   SET
    amps = ( SELECT 65
               FROM materials AS m              
               JOIN material_thickness AS mt
                 ON m.thickness_id = mt.id 
              WHERE setting.material_id = m.id
                AND mt.thickness BETWEEN 5 AND 10 )
  WHERE EXISTS ( SELECT 65
               FROM materials AS m              
               JOIN material_thickness AS mt
                 ON m.thickness_id = mt.id 
              WHERE setting.material_id = m.id
                AND mt.thickness BETWEEN 5 AND 10 )

или, что еще лучше, без повторения подзапроса, в котором используется with..as, включая исходный запрос

WITH T AS
(
 SELECT
    s.id AS setting_id,
    s.amps AS setting_amps
   FROM
    setting AS s
   JOIN materials AS m ON
    s.material_id = m.id
   JOIN material_thickness AS mt ON
    m.thickness_id = mt.id
  WHERE
    mt.thickness BETWEEN 5 AND 10
)
UPDATE setting
   SET amps = 65
 WHERE EXISTS (SELECT 1 FROM T WHERE setting_id = setting.id)

Демо

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