2016-07-15 91 views
2

在這個傳統的SQL數據庫與數百個表,我需要做一個內部連接在其名稱中的所有表如下格式:SQL內連接基於表名模式

  • barX_foo_bazX
  • barX_foo_bazY
  • barZ_foo_bazZ
  • 我想內部連接以foo的所有表在其名稱

我不確定這是否可能。

顯然,這種語法是不是(但它可能有助於瞭解我瞄準):

USE [LegacyDB_Name] 

SELECT * 
FROM '%_foo_%' inner join '%_foo_%' 
where my_stuff_is(some condition) 

有什麼建議?關於如何做到這一點的想法?也許有一個更容易的路徑,這個年輕的padawan沒有看到...

很多謝謝!

+0

不,這是不可能的。 –

+0

@vetras:如果你可以想出每個表的連接條件,或者它們是相同的,那麼它是可能的 – TheGameiswar

回答

2

我不確定這是可能的。

不可以,表名不能包含或使用通配符,它​​們必須是字符串。

我的建議是找到這些選擇查詢的任何程序,並在其中的查詢中包含所需的任何模式匹配。

但是,您的查詢必須包含表名作爲字符串。

+0

只是一個想法,如果你使用'with'語句從模式中選擇表名並在執行之前處理它函數中的查詢,以便您有一個預先過濾過的字符串數組? – Tikkes

+0

@Tikkes這就是我所說的「在創建查詢的程序中包含您需要的任何模式匹配」。使用其他信息來獲取名稱,然後進行查詢,但查詢必須包含適當的表名。 – Magisch

1

也許最簡單的方法是基於下面的查詢聲明一個遊標並構建一個動態的sql查詢。研究tsql遊標和動態sql執行,它應該相當簡單。

SELECT * 
    FROM information_schema.tables 
    Where Table_Type = 'Base Table' And Table_Name Like '%_foo_%' 
1

如果你的表都具有相同的結構(即列),那麼你可以通過兩個步驟來做到這一點。

  1. 生成SQL語句:

    select 'UNION ALL SELECT ''' + table_name + ''' AS table_name, * FROM ' 
         + table_name AS stmt 
    from information_schema.tables 
    where table_type = 'BASE TABLE' 
        and table_catalog = 'LegacyDB_Name' 
        and table_name LIKE '%foo%'; 
    

    的輸出將是這樣的:

    stmt 
    -------------------------------------------------------------------- 
    UNION ALL SELECT 'barX_foo_bazX' AS table_name, * FROM barX_foo_bazX 
    UNION ALL SELECT 'barX_foo_bazY' AS table_name, * FROM barX_foo_bazY 
    UNION ALL SELECT 'barX_foo_bazZ' AS table_name, * FROM barX_foo_bazZ 
    

    從這個輸出,複製SQL行並刪除第2個字(UNION ALL)從第一行開始。這是一個有效的SQL語句。

  2. 執行上述

    得到的SQL語句。如果你需要這個SQL更多的時候,然後爲它創建一個視圖:

    CREATE OR REPLACE VIEW all_foo AS 
           SELECT 'barX_foo_bazX' AS table_name, * FROM barX_foo_bazX 
        UNION ALL SELECT 'barX_foo_bazY' AS table_name, * FROM barX_foo_bazY 
        UNION ALL SELECT 'barX_foo_bazZ' AS table_name, * FROM barX_foo_bazZ; 
    

    現在,您可以查詢像

    SELECT * FROM all_foo WHERE ...