У меня проблема с обновлением таблицы со столбцами, перенесенными из другой таблицы. Я исследовал здесь и вплотную приблизился к решению, но все же я не попал в точку.
У меня есть таблица 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
Проблема заключается в ваших предложениях. Использование 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-скрипта я не могу его протестировать.
Спасибо! Оно работает! Мне просто пришлось изменить длину столбцов 50...76
из VARCHAR с 50 по 255. В конце каждого выводимого заявления есть только один дополнительный "). Время исполнения довольно хорошее: 15 секунд для обновления> 3 миллиона записей.