2013-11-25 3 views
0

Я понимаю, что то, что ниже не работает:Есть ли способ сделать это в MySQL?

set @T := (select A, group_concat(B) from X inner join Z on ...); 

update T1 inner join @T as T2 on T1.A=T2.A 
set ... 

Но концептуально это то, что я хочу сделать. Я буду использовать результирующий набор @T совсем немного в моем файле SQL, и чтобы сохранить обрезку файла, я хотел бы сохранить его в макросе, а не вводить его в каждом запросе.

Есть ли способ сделать это? Я просмотрел хранимые функции и процедуры, а также курсоры, но не нашел хорошего решения.

+2

Почему бы не написать результирующий набор в таблицу памяти temp или аналогичную? –

+2

Если '@ T' является результатом запроса SELECT и вы хотите использовать его много раз, его можно сохранить в (временной) таблице. –

+0

Привет, ребята, это очень хорошая идея, спасибо! – ktm5124

ответ

1

Комментарии дали хорошее предложение использовать временную таблицу. Я отправлю пример и пометьте свой ответ как CW.

CREATE TEMPORARY TABLE TempT AS SELECT A, GROUP_CONCAT(B) FROM X INNER JOIN Z ON ...; 

UPDATE T1 INNER JOIN TempT AS T2 ON T1.A=T2.A 
SET ... 

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

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

Тогда у вас есть некоторые решения по дизайну, чтобы определить, как часто вы его обрезаете и повторно заполняете текущими данными. Это зависит от вашего мнения - нет правильного ответа, и это one of the hardest problems in computer science to solve.

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

CREATE OR REPLACE VIEW TempT AS SELECT A, GROUP_CONCAT(B) FROM X INNER JOIN Z ON ...; 
Смежные вопросы