2014-01-15 37 views
0

我试图做到的,是让从基于列名多个表的信息,然后从该结果缩小。见取决于列名来自多个表中的数据

有得这种效果:

select 
    top 3 * 
from 
    (Select TABLE_NAME From INFORMATION_SCHEMA.COLUMNS Where column_name = 'modify_id') 
where 
    MODIFY_ID = 'MULVEYR' or 
    MODIFY_ID = 'MULVEYR2' and 
    MODIFY_DATE > '12/31/2013' 

如果可能的话,如果它返回0结果该表不返回任何东西。具有该列的表的数目是188,这就是为什么我需要得到的东西的自动化,而不是写出来或手动检查每个。

理想输出: 在188个表中,可以说只有50个具有我需要的信息(where子句),那么我只能看到这50个表的前3行,而不是空白结果其余133

+0

是此查询工作? –

+0

@JDeveloper不,给我的“关键字‘其中’附近有语法错误。” – JohnZ

+0

所以,你有188台具有类似的结构,你想跨越所有这些工作的查询? – Bill

回答

1

如果我读了你的权利,你想搜索所有的表为一个的具有特定列,然后从每个返回几条记录的那些表。这是一个解决方案,但我警告你,它使用动态SQL和游标,所以它非常慢。

Declare cur_TableList Cursor 
    For 
    Select TABLE_SCHEMA, TABLE_NAME 
    from INFORMATION_SCHEMA.COLUMNS 
    Where COLUMN_NAME='modify_id'; 

Open cur_TableList 
Fetch Next From cur_TableList 
    Into @tblSchema, @tblName; 

While @@FETCH_STATUS = 0 
BEGIN 
    Set @sqlStmt = N'Select Top 3 * From ' + @tblSchema + '.' + @tblName; 
    Set @sqlStmt = @sqlStmt + ' where MODIFY_ID = ''MULVEYR'' or '; 
    Set @sqlStmt = @sqlStmt + 'MODIFY_ID = ''MULVEYR2'' and '; 
    Set @sqlStmt = @sqlStmt + 'MODIFY_DATE > ''12/31/2013'' '; 

    Print @tblName; 

    EXECUTE sp_executesql @sqlStmt ; 

    Fetch Next From cur_TableList 
     Into @tblSchema, @tblName; 
END 

CLOSE cur_TableList; 
DEALLOCATE cur_TableList; 
+0

工作得很好,只是最后一点,如果它可能...那些没有任何返回(0行影响),如果他们根本不必出现在结果窗口 – JohnZ

+0

我相信你可以添加一个IF EXISTS在他们的地方。 – Bill

+0

heh好的。非常感谢您的帮助。非常感激 – JohnZ

0

尝试此查询: -

select top 3 x.* from 
(
select * from INFORMATION_SCHEMA.COLUMNS where column_name = 'modify_id'  
)x 
+0

这不起作用(也试过),因为INFORMATION_SCHEMA.COLUMNS返回列信息,而不是表信息,因此使用where子句是为表引发一个错误。 – JohnZ

+0

即使在编辑之后仍然有相同的结果 – JohnZ

+0

从您获取这些字段的位置MODIFY_ID和MODIFY_DATE。 –

相关问题