MySQL - ОБНОВИТЬ одну таблицу со столбцами, транспонированными из другой таблицы

0

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

У меня есть таблица tbl_g08t1 со следующими столбцами вместе с другими, не включенными для краткости (1-я строка: имена столбцов):

shl62 carrno    typ stat    50      71      72      73      74      75      76
747  35712528   0   6       29  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)
747  35722615   0   6       29  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)
747  35722625   0   6       29  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)
747  35722664   0   6       29  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)
821  35136730   0   8     (NULL)(NULL)  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)
821  35722678   0   8       29  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)
821  35833255   0   6     (NULL)(NULL)  (NULL)  (NULL)  (NULL)  (NULL)  (NULL)

У меня есть вторая таблица tbl_s80t1 с freetexts, она выглядит так:

sysfromt    sysshort freecode freetext
G08T1       35722652    98      101
G08T1       35722652    132     KCF9F27                                                               
G08T1       35722664    50      29
G08T1       35722664    71      20171004
G08T1       35722664    74      01Y                                                                   
G08T1       35722664    75      3
G08T1       35722664    76      A17108176                                                             
G08T1       35722664    97      8397080
G08T1       35722664    98      101
G08T1       35722664    132     KCF9F13                                                               
G08T1       35722678    50      29
G08T1       35722678    71      20171005
G08T1       35722678    74      01Y                                                                   
G08T1       35722678    75      3
G08T1       35722678    76      D1718496                                                              
G08T1       35722678    97      8395896
G08T1       35722678    98      101
G08T1       35722678    132     KCF9F27                                                               
G08T1       35722684    8       2017-10-05 09:53 C:3 Out:9 General fault!                             
G08T1       35722684    8       2017-10-05 09:54 C:3 Out:9 General fault!                             
G08T1       35722684    50      29

Я пытаюсь объединить две таблицы с

'tbl_g08t1'.'carrno' = 'tbl_s80t1'.'sysshort' AND 'tbl_s80t1'.'sysfromt' = 'G08T1'

и транспонируя некоторые строки второго в соответствии с freecode, я получил следующий код:

USE general_db;
    UPDATE tbl_g08t1
    LEFT JOIN 'tbl_s80t1' ON ('tbl_g08t1'.'carrno' = 'tbl_s80t1'.'sysshort' AND
              'tbl_s80t1'.'sysfromt' = 'G08T1')
      SET
         '50' = (SELECT MAX('tbl_s80t1'.'freetext') WHERE 'tbl_s80t1'.'freecode' = 50),
         '71' = (SELECT MAX('tbl_s80t1'.'freetext') WHERE 'tbl_s80t1'.'freecode' = 72),
         '72' = (SELECT MAX('tbl_s80t1'.'freetext') WHERE 'tbl_s80t1'.'freecode' = 73),
         '76' = (SELECT MAX('tbl_s80t1'.'freetext') WHERE 'tbl_s80t1'.'freecode' = 76)

Проблема в том, что обновляется только один столбец 50, все остальные 71...76 имеют все (NULL) значение. Я ожидал, что там freetext значения freetext, конечно, где значение freecode имеет значение.

Ну, я не знаю, был ли я чист... или сделал больше путаницы. Спасибо за любой намек.

Эма

PS при запуске запроса я получаю сообщение

33278 row(s) affected, 64 warning(s): 1265 Data truncated for column '50' at row 1
  • 0
    Колонны 50-76 Varchar или Int?
  • 0
    Они все варчар
Теги:
sql-update

2 ответа

0
Лучший ответ

Проблема заключается в ваших предложениях. Использование MAX() и SELECT является дополнительным запросом и не относится к предложению JOIN. Они независимы от этого. Я думаю, это может сработать:

USE general_db;
UPDATE tbl_g08t1
    SET
     '50' = (SELECT MAX('tbl_s80t1'.'freetext') FROM tbl_s80t1 WHERE 'tbl_s80t1'.'freecode' = 50 AND 'tbl_g08t1'.'carrno' = 'tbl_s80t1'.'sysshort' AND 'tbl_s80t1'.'sysfromt' = 'G08T1')),
     '71' = (SELECT MAX('tbl_s80t1'.'freetext') FROM tbl_s80t1 WHERE 'tbl_s80t1'.'freecode' = 71 AND 'tbl_g08t1'.'carrno' = 'tbl_s80t1'.'sysshort' AND 'tbl_s80t1'.'sysfromt' = 'G08T1')),
     '72' = (SELECT MAX('tbl_s80t1'.'freetext') FROM tbl_s80t1 WHERE 'tbl_s80t1'.'freecode' = 73 AND 'tbl_g08t1'.'carrno' = 'tbl_s80t1'.'sysshort' AND 'tbl_s80t1'.'sysfromt' = 'G08T1')),
     '76' = (SELECT MAX('tbl_s80t1'.'freetext') FROM tbl_s80t1 WHERE 'tbl_s80t1'.'freecode' = 76 AND 'tbl_g08t1'.'carrno' = 'tbl_s80t1'.'sysshort' AND 'tbl_s80t1'.'sysfromt' = 'G08T1'))

Без SQL-скрипта я не могу его протестировать.

0

Спасибо! Оно работает! Мне просто пришлось изменить длину столбцов 50...76 из VARCHAR с 50 по 255. В конце каждого выводимого заявления есть только один дополнительный "). Время исполнения довольно хорошее: 15 секунд для обновления> 3 миллиона записей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню