ОБНОВЛЕНИЕ с ВНУТРЕННИМ РЕЙТИНГОМ или МИН? - PullRequest
5 голосов
/ 07 сентября 2011

Я пытаюсь передать некоторые данные между таблицами.Таблица 'NEW' может содержать несколько записей данных, которые изначально не должны были иметь несколько записей в таблице 'OLD'.Я хотел бы взять данные из таблицы 'OLD' и скопировать их в новую таблицу, где NEW.ID является самым низким, где new.OtherID = old.OtherID, в основном MIN (ID) для каждой группы OtherID, равнойдруг друга.

Таблица 'NEW'

ID | OtherID | Data
1       1      NULL
2       1      NULL
3       2      NULL
4       3      NULL
5       3      NULL

'OLD'

OtherID | Data <br>
1            data1
2            data2
3            data3
4            data4
5            data5

Желаемый результат в обновленной таблице 'NEW':

ID | OtherID | Data <br>
1       1       data1
2       1       NULL
3       2       data2
4       3       data3
5       3       NULL

и т. Д.

Спасибо!

Ответы [ 4 ]

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

Вот как вы можете использовать INNER JOIN с UPDATE в MySQL:

UPDATE NEW n
  INNER JOIN (
    SELECT
      OtherID,
      MIN(ID) AS ID
    FROM NEW
    GROUP BY OtherID
  ) m ON n.ID = m.ID
  INNER JOIN OLD o ON n.OtherID = o.OtherID
SET n.Data = o.Data
0 голосов
/ 07 сентября 2011

Вы можете попробовать:

UPDATE new
   SET Data = ( SELECT DATA FROM old WHERE otherID = new.otherID )
 WHERE NOT EXIST
       ( SELECT NULL FROM new AS new2
          WHERE new2.id < new.id
            AND new2.otherID = new.otherID )

Обратите внимание, что это стандартный SQL92 и должен работать с любой СУБД.

0 голосов
/ 07 сентября 2011

Это работало для меня в PostgreSQL, хотя, возможно, я ошибся в цитировании MySQL.

UPDATE newtable SET
 `Data` = oldtable.`Data`
FROM
 oldtable
WHERE
 newtable.`ID` IN (
  SELECT MIN(sub_newtable.`ID`)
  FROM newtable sub_newtable
  GROUP BY
   sub_newtable.`OtherID`
 )
 AND newtable.`OtherID` = oldtable.`OtherID`
0 голосов
/ 07 сентября 2011

Вы можете использовать:

UPDATE `NEW` 
LEFT JOIN `OLD` 
    ON `NEW`.`OtherID` = `OLD`.`ID`
SET `NEW`.`Data` = `OLD`.`Data`

РЕДАКТИРОВАТЬ: Извините, это обновит все записи, которые соответствуют столбцам в OLD.

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