SQLite: оператор UPDATE с подзапросом COUNT - PullRequest
0 голосов
UPDATE OPERATING_SYSTEM
SET App_Count = 
    (SELECT COUNT(OPERATE.App_ID) AS App_Count 
     FROM OPERATING_SYSTEM , OPERATE WHERE OPERATING_SYSTEM.Name = OPERATE.Operating_System_Name
     GROUP BY OPERATING_SYSTEM.Name);

Этот подвыбор возвращает общее количество для каждой записи enter image description here

Но когда вы выполняете запрос в одиночку, он возвращает правильное количество для каждой записи.

enter image description here

Ответы [ 4 ]

0 голосов
/ 27 февраля 2019

Подзапрос не должен содержать присоединение к OPERATING_SYSTEM:

UPDATE OPERATING_SYSTEM
SET App_Count =
    (SELECT COUNT(OPERATE.App_ID) AS App_Count
     FROM OPERATE
     WHERE OPERATING_SYSTEM.Name = OPERATE.Operating_System_Name
     GROUP BY OPERATE.Operating_System_Name);

dbfiddle здесь

0 голосов
/ 27 февраля 2019

Способ работы операторов UPDATE состоит в том, что подзапрос оценивается для каждой строки в целевой таблице.Поскольку ваш подзапрос не имеет отношения к обновлению, он будет обработан один раз, а результат будет размещен в каждой строке.Чего вам не хватает, так это корреляции.Для каждой обновляемой строки вы хотите рассчитать количество для этого конкретного имени.Попробуйте что-то вроде:

UPDATE OPERATING_SYSTEM
SET App_Count = 
         (
          SELECT COUNT(O.App_ID) 
          FROM OPERATING_SYSTEM AS OS, OPERATE AS O 
          WHERE OS.Name = O.Operating_System_Name 
                AND OS.Name = OPERATING_SYSTEM.Name
         );
0 голосов
/ 27 февраля 2019

Я думаю, вам нужно:

UPDATE OPERATING_SYSTEM 
SET App_Count = (
  SELECT COUNT(App_ID) FROM OPERATE WHERE Operating_System_Name = OPERATING_SYSTEM.Name
)

Вам не нужно присоединять подзапрос к таблице OPERATING_SYSTEM.Количество, которое вам нужно, есть в таблице OPERATE

0 голосов
/ 27 февраля 2019

Ваше утверждение UPDATE нуждается в предложении WHERE.Вы обновляете все строки до одного из значений, возвращаемых подзапросом (в данном случае 18).

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