Обновление с вложенным подзапросом (сумма), чтобы получить ограничение на предложение обновления - PullRequest
4 голосов
/ 12 сентября 2011

Получив этот бит SQL в качестве скрипта обновления, я попытался добавить рабочий раунд, чтобы не иметь возможности включать таблицу в выражение в качестве условия, поэтому использовать подзапросы, но изо всех сил пытался получить это работа.

По сути, мне нужно обновить значение в таблице 1 суммированием поля в таблице 2, но только в тех случаях, когда два других поля совпадают в паре таблиц и на основе поля6, ограничение применяется к предложению обновления.

     UPDATE table1 W SET Field1=(SELECT field2 FROM
     (SELECT A.id, B.field3, SUM(A.field2) AS field2 
     FROM table2 A, table3 B, table4 P
     WHERE A.id=B.id AND P.field6=B.field6) B ) WHERE W.field6=B.field6

В примере с реальным миром выберите сумму очков, пропущенных в игре в регби, когда игрок в регби принял участие в матче. Таблица 2 содержит результаты (включая счет). Таблица 3 содержит таблицы команд, а таблицы 1 и 4 - это те же таблицы игроков, которые необходимо обновить.

Надеюсь, это достаточно ясно, и кто-то может указать мне правильное направление.

Попробовал следующее:

     UPDATE $WSLKEEP W, $WSLFIX A, $WSLFIXPLAY B 
     SET W.F_CONCEDED=SUM(A.F_AGAINST) 
     WHERE A.F_ID=B.F_GAMEID 
     AND B.F_NAME=W.F_NAME"

но теперь застрял с: Неправильное использование групповой функции

С уважением

Ответы [ 2 ]

5 голосов
/ 13 сентября 2011

Похоже, что ваш подзапрос должен группироваться по field6 и выставлять этот столбец для внутреннего соединения с table1. Вот как вы это делаете в MySQL :

UPDATE table1 W
  INNER JOIN (
    SELECT B.field6, SUM(A.field2) AS field2 
    FROM table2 A, table3 B, table4 P
    WHERE A.id=B.id AND P.field6=B.field6
    GROUP BY B.field6
  ) B ON W.field6=B.field6
SET W.Field1 = B.Field2

И пока мы занимаемся этим, я бы также рекомендовал вам воздерживаться от (ab) использования запятых в пользу явных объединений. Последний, хотя и необычный на первый взгляд после долгого привыкания к другому синтаксису, может очень скоро стать привычным и гораздо более интуитивным, чем первый. По этой теме было сказано очень много , и некоторые люди могут иметь достаточно твердые мнения о запятых соединениях. Я говорю, что запятые могут по-прежнему иметь свою долю использования. Однако, когда вы присоединяетесь к условию, текущий синтаксис ANSI должен быть вашим выбором.

Вот вышеупомянутое утверждение с преобразованным подзапросом, чтобы использовать явные объединения:

UPDATE table1 W
  INNER JOIN (
    SELECT B.field6, SUM(A.field2) AS field2 
    FROM table2 A
      INNER JOIN table3 B ON A.id = B.id
      INNER JOIN table4 P ON P.field6 = B.field6
    GROUP BY B.field6
  ) B ON W.field6 = B.field6
SET W.Field1 = B.Field2
2 голосов
/ 12 сентября 2011

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

UPDATE table1 W, table2 A, table3 B, table4 P 
SET W.Field1 = SUM(A.field2) ...

Мне неясно, что именно вы пытаетесь обновить, но я просто хотел сказать, что вы часто можете избегать подзапросов, используя этот вид синтаксиса.

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