Операнд должен содержать 1 столбец при объединении таблиц с обновлением

Я пытаюсь обновить таблицу путем объединения двух запросов следующим образом

 UPDATE result, games_played
      SET result.precentage_correct =
(
SELECT user_id, 100*SUM(n_win)/SUM(n_total) AS pct_win FROM
(SELECT user_id, COUNT(user_id) AS n_win,
  NULL AS n_total
  FROM games_played
  WHERE winner != 'n'
  AND game = 1
  GROUP BY user_id
  UNION SELECT user_id, NULL AS n_win,
  COUNT(user_id) AS n_total
  FROM games_played
  WHERE game = 1
  GROUP BY user_id
) AS counts
GROUP BY counts.user_id
)
WHERE result.user_id = games_played.user_id

Однако я получаю ошибку

Operand should contain 1 column(s)

Кто-нибудь знает, что я делаю не так... Я могу выбрать результат в виде новой таблицы

SQL скрипка http://sqlfiddle.com/

3 ответа

Решение

Попробуйте добавить критерии фильтра в свой подзапрос. Ошибка "Подзапрос возвращает более 1 строки", как вы упомянули в комментарии, означает, что подзапрос (тот, который вы назвали AS), вернул более одного результата. Что-то вроде этого:

UPDATE result, games_played
      SET result.precentage_correct =
(
SELECT 100*SUM(n_win)/SUM(n_total) AS pct_win FROM
(SELECT user_id, COUNT(user_id) AS n_win,
  NULL AS n_total
  FROM games_played
  WHERE winner != 'n'
  AND game = 1
  GROUP BY user_id
  UNION SELECT user_id, NULL AS n_win,
  COUNT(user_id) AS n_total
  FROM games_played
  WHERE game = 1
  GROUP BY user_id
) AS counts
GROUP BY counts.user_id
HAVING counts.user_id = result.user_id
)
WHERE result.user_id = games_played.user_id

Вы можете упростить UPDATE, Смотрите SQL-скрипку:

UPDATE result
SET result.precentage_correct =
    ( SELECT 100*SUM(winner <> 'n')/COUNT(*) AS pct_win
      FROM games_played
      WHERE game = 1
        AND result.user_id = games_played.user_id
    ) ;

Или с запросом, больше похожим на вашу логику. Это даже лучше, потому что (в отличие от предыдущего) это не будет UPDATE целый result таблицы (с пустыми значениями для тех пользователей, в которых нет игр), но только для тех пользователей, у которых есть хотя бы один результат в games_played Таблица. Протестировано на SQL-Fiddle-2

UPDATE result AS r
  JOIN
    ( SELECT user_id, 
             100*SUM(winner <> 'n')/COUNT(*) AS pct_win
      FROM games_played
      WHERE game = 1
      GROUP BY user_id
    ) AS gp
    ON r.user_id = gp.user_id
SET r.precentage_correct = gp.pct_win ;

Я не слишком уверен в логике вашего запроса, но вы можете исправить синтаксическую ошибку, фактически используя запрос в виде таблицы, добавив его в список исходных таблиц.

http://sqlfiddle.com/

UPDATE result, games_played,
  (SELECT t1.user_id, 100*SUM(t1.n_win)/SUM(t1.n_total) AS pct_win FROM
   (SELECT user_id, COUNT(user_id) AS n_win, NULL AS n_total
     FROM games_played
     WHERE winner != 'n' AND game = 1
     GROUP BY user_id
    UNION 
    SELECT user_id, NULL AS n_win, COUNT(user_id) AS n_total
     FROM games_played
     WHERE game = 1
     GROUP BY user_id
   ) AS t1
  ) AS counts

SET result.precentage_correct = counts.pct_win
WHERE result.user_id = games_played.user_id
Другие вопросы по тегам