2014-01-15 66 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。 –

相關問題