查询中的MySQL查询

时间:2012-09-10 20:10:20

标签: mysql sql

所以我正在尝试编写一个查询,从查询中获取列信息 这就是我的尝试:

Select login from TableName AS alias_name

SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE,COLUMN_DEFAULT,
FROM  INFORMATION_SCHEMA.COLUMNS  WHERE TABLE_Name = 'alias_name' ORDER BY ORDINAL_POSITION ASC;

... 这不起作用,因为查询不保存为临时表或不保存 ...

所以我需要将上面两个查询的功能组合成一个查询 感谢

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE,COLUMN_DEFAULT, 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_Name IN (SELECT login from TableName) 
ORDER BY ORDINAL_POSITION ASC;

这是你想要做的吗?

答案 1 :(得分:-1)

这是不可能的;不是纯SQL。这不是MySQL的属性 - 其他RDBMS-es也不以这种方式提供查询元数据。

在纯SQL中最接近解决此问题的方法是将查询转换为视图,然后获取该视图的信息:

CREATE OR REPLACE VIEW _query
AS 
SELECT login 
FROM   TableName 
;

SELECT *
FROM   information_schema.COLUMNS
WHERE  table_schema = SCHEMA()
AND    table_name   = '_query'
;

这种方法的问题在于视图名称必须是唯一的,因此具有多个并发用户的应用程序面临着为视图提供唯一名称的挑战。这可以使用动态sql:

SET @name = CONCAT(_query, connection_id())
,   @stmt = CONCAT(
        ' CREATE VIEW '
    ,   @name
    ,   ' AS SELECT login FROM Tablename'
    )
; 

PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SELECT *
FROM   information_schema.columns
WHERE  table_schema = schema()
AND    table_name = @name
;

最后,你应该在事后清理你的观点:

SET @stmt = CONCAT('DROP VIEW ', @name); 
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

问题是,为什么在SQL内部需要这个?通常,结果集元数据在SQL客户端中可用 - 通常,驱动程序或客户端库在您准备SQL语句时提供此功能。例如在JDBC http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getMetaData()