如何在sql中获取表名和一列?

时间:2016-05-18 05:19:15

标签: mysql sql sql-server

我的数据库中有几张表。我希望获得所有表名以及一个字段,即last_timestamp,这在每个表中都很常见。 我知道表名

我尝试了以下查询,但它只给了我一个表,我无法为我的要求编写查询

SELECT t.table_name, MAX(c.last_timestamp) FROM information_schema.tables t, city c WHERE t.table_name='city' or t.table_name  ='city_area' and TABLE_SCHEMA='my_db';

这给了我

'city', '2016-05-13 15:08:07',

我想我需要表的动态别名。但我不明白该怎么做。有可能吗?

3 个答案:

答案 0 :(得分:0)

请尝试使用以下代码获取所需的输出。

--Creating Two Temp tables
CREATE TABLE #Temp1
( 
ID int IDENTITY(1,1),
TableName Varchar(50)
)

CREATE TABLE #Temp2
( 
TableName Varchar(50),
last_timestamp Date
)
--Inserting the required tables into Temp table 1, From information_schema
INSERT INTO #Temp1
SELECT t.table_name AS TableName FROM information_schema.tables t WHERE    t.table_name IN ('Table1','Table2') AND TABLE_SCHEMA='my_db'
--Below code gives the desired output.
DECLARE @Count INT
DECLARE @Count1 INT
DECLARE @Query nvarchar(max)
DECLARE @TableVariable Varchar(100)
SET @Count1 =0
SET @Count =(SELECT count(ID) FROM #Temp1)
WHILE (@Count1<@Count) 
BEGIN
   SET @Count1 =(@Count1 +1)
   SET @TableVariable = (SELECT TableName FROM #Temp1 WHERE ID =@Count1)

   SET @Query = 'SELECT t.table_name AS TableName,max(c.last_timestamp)AS  last_timestamp FROM information_schema.tables t,' +@TableVariable+ ' c
              WHERE t.table_name IN ('''+@TableVariable+''') GROUP BY   t.table_name'
    INSERT  INTO #Temp2 EXECUTE SP_EXECUTESQL @Query
END
SELECT * FROM #Temp2

答案 1 :(得分:0)

use AdventureWorks2012
go
declare @sql varchar(max) = ''
declare @table varchar(max)
declare sqlcursor cursor for
SELECT  t.TABLE_SCHEMA + '.' + c.table_name
        --,c.column_name 
from    [INFORMATION_SCHEMA].[TABLES] t
join    [INFORMATION_SCHEMA].[COLUMNS] c on c.table_name = t.table_name
WHERE   COLUMN_NAME = 'ModifiedDate'
OPEN    sqlcursor   
FETCH NEXT FROM sqlcursor INTO @table   
set @sql = 'Select ' + char(39) + @table + char(39) + ', max(ModifiedDate) from '  + @table + ' '
WHILE @@FETCH_STATUS = 0   
BEGIN   
       FETCH NEXT FROM sqlcursor INTO @table 
       IF @@FETCH_STATUS = 0   
       set @sql = @sql + ' union ' +  'Select ' + char(39) + @table + char(39) + ', max(ModifiedDate) from '  + @table + ' '
END   

CLOSE sqlcursor   
DEALLOCATE sqlcursor

EXEC (@sql)

答案 2 :(得分:0)

假设表格为Q37290859Table1Q37290859Table2,每个表格都有IdDateColumn。然后你可以使用简单的while循环(从而避免游标)来构建最终查询。

declare @sql varchar(max)
declare @table varchar(20)
declare @column varchar(20)
declare @tableList table 
(
    table_id int identity(1,1), 
    table_name varchar(30), 
    column_name varchar(30)
)

insert into @tableList 
    select t.table_name, c.column_name 
    from information_schema.tables t
    inner join information_schema.columns c on t.table_name = c.table_name
    where c.column_name = 'DateColumn'

declare @ctr int = 1
declare @ctr_max int = (select max(table_id) from @tableList)
set @sql = ''

while @ctr <= @ctr_max
begin
    select top 1 @table = table_name, @column = column_name from @tableList where table_id = @ctr
    if @ctr > 1 -- add union
        set @sql = @sql + ' union '
    set @sql = @sql + 'select '''+@table+''', max('+@column+') from ' + @table
    set @ctr = @ctr + 1
end

exec (@sql)