Acho que entendi que você deseja selecionar uma coluna por nome e os nomes são strings em seu TABLE_MASTER.
Você não pode fazer isso em uma única consulta SQL, porque o SQL não pode selecionar uma coluna usando uma expressão de string. Há uma diferença entre uma string e um identificador. Por exemplo, isso seleciona dados de uma coluna por identificador:
SELECT header01 ...
Mas o seguinte é uma expressão de string (uma simples, que é apenas um valor constante). Ele retorna apenas uma string fixa 'header01', NÃO os dados de uma coluna com esse nome:
SELECT 'header01' ...
Da mesma forma, usar qualquer outra expressão em uma lista de seleção seleciona apenas o valor dessa expressão, NÃO os dados armazenados em uma coluna nomeada pelo valor da string da expressão.
Portanto, se você quiser que uma consulta retorne uma coluna dinâmica nomeada por alguma outra variável ou expressão, não poderá fazê-lo na mesma consulta em que leu essa expressão. Você precisa formatar uma nova consulta SQL a partir dos valores lidos. Isso é chamado de instrução SQL dinâmica (já mencionado por spencer7593, que postou uma resposta enquanto eu escrevia minha própria resposta).
Você pode usar seu TABLE_MASTER para formatar uma instrução SQL dinâmica para buscar colunas e redefinir seu alias:
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ',
QUOTE(MAX(NAME)), ' AS NAME ',
'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;
O resultado disso é uma string que forma outra instrução SELECT, esta renomeia as colunas como você deseja:
SELECT header01 AS header_master01,header02 AS header_master02, 'Paul' AS NAME FROM TABLE_EXAMPLE
Então você pode usar a string armazenada em
@sql
como uma consulta SQL dinâmica. Aqui está o procedimento que faz isso:
DELIMITER ;;
CREATE PROCEDURE MyProc()
BEGIN
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ',
QUOTE(MAX(NAME)), ' AS NAME ',
'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
DELIMITER ;
Chame o procedimento e obtenha o resultado:
CALL MyProc();
+-----------------+-----------------+------+
| header_master01 | header_master02 | NAME |
+-----------------+-----------------+------+
| data01 | data02 | Paul |
| data11 | data12 | Paul |
+-----------------+-----------------+------+
Eu tenho que comentar que isso é um monte de problemas para passar. Prefiro buscar os dados como estão no banco de dados e reformatá-los no código do meu aplicativo. Assim, não precisaria usar nenhum SQL dinâmico para formatar as colunas.