2010-09-15 9 views
12

me sale un error de sintaxis cuando corro el siguiente:¿Cómo MOSTRAR COLUMNAS desde una consulta SELECT (en lugar de una tabla)?

show columns from (select * from (select * from my_table) as T) 

¿Cómo puedo mostrar las columnas de una consulta que escribí, en lugar de partir de una tabla?

+0

¿Simplemente desea recuperar las columnas asociadas con una tabla y su información correspondiente? –

+0

SÍ, pero desde Dynamic Query, no desde TABLE –

+3

Hay API para buscar metadatos sobre un conjunto de resultados. ¿Qué entorno de lenguaje de programación usas? Debería haber soluciones para la mayoría de los idiomas, pero para dar un ejemplo necesitaría saber cuál usa. –

Respuesta

-1

probar esto -

SHOW COLUMNS FROM (select * from my_table) T 

o directamente SHOW COLUMNS FROM my_table

+4

No puedo ejecutar esta consulta 'SHOW COLUMNS FROM (select * from my_table) T' parece que tiene un error. – Mavichow

+1

@Sachin, Dude esto no funciona: 'MOSTRAR COLUMNAS DE (seleccione * de mi_tabla) T' – Pacerier

4

Parece que esta declaración sólo acepta las tablas existentes.

Así que creé una nueva tabla temporal con mi consulta y obtuve los nombres de las columnas desde allí.

/*if the exporting table was created before, then delete it*/ 
DROP TABLE IF EXISTS exportTable; 

/*create the temporary table (check if you have mySQL permission to do so)*/ 
CREATE TEMPORARY TABLE exportTable AS (your_query); 

/*get result table (this is a table, the columns names are in the first column of this table ['Field'])*/ 
SHOW COLUMNS FROM exportTable; 

La tabla temporal se crea en el contexto de la sesión y se bloqueará cuando se cierre la sesión. Lo mismo es para la tabla SHOW COLUMNS. Puede considerar el impacto de estas creaciones de tabla en el disco del servidor.

Puede utilizar la palabra clave TEMPORARY al crear una tabla. Una tabla TEMPORAL es visible solo para la sesión actual, y se elimina automáticamente cuando se cierra la sesión. Esto significa que dos sesiones diferentes pueden usar el mismo nombre de tabla temporal sin conflicto entre ellas o con una tabla existente no TEMPORAL del mismo nombre. (La tabla existente está oculta hasta que se descarta la tabla temporal). Para crear tablas temporales, debe tener el privilegio CREAR TABLAS TEMPORALES.

http://dev.mysql.com/doc/refman/5.7/en/create-table.html

5

MÉTODO 1: Tabla Temporal

Las respuestas ya publicados sobre el uso de una tabla temporal suele ser la solución más adecuada. Pero hay un punto importante que si la consulta se ejecuta tal como está, todas las uniones, etc. se procesarán, lo que podría llevar mucho tiempo en algunos casos. Afortunadamente, MySQL permite que LIMIT 0 no devuelva filas y el documentation indica que esto "devuelve rápidamente un conjunto vacío". El siguiente procedimiento almacenado va a hacer este trabajo para usted mediante la adopción de una cadena de consulta SQL como entrada, envolviéndolo con LIMIT 0, ejecutar la consulta dinámica para producir una tabla temporal y luego mostrando sus columnas:

CREATE PROCEDURE showColumns(IN sqlToShow TEXT) 
BEGIN 
    DROP TEMPORARY TABLE IF EXISTS tempTable; 
    SET @sqlLimit0 = CONCAT('CREATE TEMPORARY TABLE tempTable AS (SELECT * FROM (', 
          sqlToShow, ') subq LIMIT 0)'); 
    PREPARE stmt FROM @sqlLimit0; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    SHOW COLUMNS FROM tempTable; 
END; 

Un punto importante es la consulta pasada no debe tener un punto y coma al final. (Si es necesario, el procedimiento almacenado podría ser modificado para eliminar el arrastre de punto y coma, pero yo quería que sea sencillo.)

Aquí está una demostración en vivo que muestra en acción: http://rextester.com/NVWY58430

MÉTODO 2: INFORMATION_SCHEMA.COLUMNAS

La misma información devuelta por SHOW COLUMNS también se puede obtener directamente de la tabla INFORMATION_SCHEMA.COLUMNS:

SELECT TABLE_NAME AS `Table`, 
     COLUMN_NAME AS `Field`, 
     COLUMN_TYPE AS `Type`, 
     IS_NULLABLE AS `Null`, 
     COLUMN_KEY AS `Key`, 
     COLUMN_DEFAULT AS `Default`, 
     EXTRA AS `Extra` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = SCHEMA() -- This uses the current schema 
    AND `TABLE_NAME` IN ('table1', 'table2', 'etc.'); 
    -- ...or could go even further and restrict to particular columns in tables if desired 

Los sufre por encima de las desventajas de requerir la tabla (y la columna opcionalmente) Nombres a ser introducidos manualmente y no muestra los nombres de los alias en el SELECT pero hace el trabajo básico. Sus ventajas son que no requiere que el usuario tenga permiso para crear una tabla temporal y la información devuelta se puede ampliar para proporcionar más información de columna, como longitud máxima de caracteres, precisión/escala numérica, comentarios de columnas, etc.

+0

funciona con una base de datos específica como no funcionaría para la base de datos de caché entre sistemas –

+0

La pregunta es para MySQL - vea las etiquetas debajo eso. –

5

Estoy usando Java para recuperar columnas de la consulta de MySql.

La mejor manera en Java para obtener información de la columna para un conjunto de resultados es el uso de la interfaz ResultSetMetaData:

PreparedStatement stmt = null; 
ResultSet result = null; 
ResultSetMetaData meta = null; 

try { 
    stmt = con.prepareStatement("SELECT * FROM MyTable"); 
    result = stmt.executeQuery(); 
} catch (SQLException e) { 
    System.out.println("SQLException: "+e.getMessage()); 
    System.exit(1); 
} 
System.out.println("Successful query"); 

try { 
    meta = result.getMetaData(); 
    System.out.println("Total columns: " + meta.getColumnCount()); 
    System.out.println("Name of column 1: " + meta.getColumnName(1)); 
    System.out.println("Type of column 1: " + meta.getColumnTypeName(1)); 

    System.out.println("Name of column 2: " + meta.getColumnName(2)); 
    System.out.println("Type of column 2: " + meta.getColumnTypeName(2)); 
} catch (SQLException e) { 
    System.out.println("SQLException: "+e.getMessage()); 
    System.exit(1); 
} 
System.out.println("Successful metadata report"); 

Mi mesa se declara:

CREATE TABLE `MyTable` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
); 

salida de mi ejemplo de Java código:

Successful query 
Total columns: 2 
Name of column 1: id 
Type of column 1: BIGINT UNSIGNED 
Name of column 2: name 
Type of column 2: VARCHAR 
Successful metadata report 

Puede obtener otra información sobre las columnas del conjunto de resultados además de sus nombres y tipos de datos. Consulte http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSetMetaData.html para ver los documentos de consulta completos en la interfaz ResultSetMetaData.

Cuestiones relacionadas