2011-10-04 30 views
1

這是我的問題:我想檢查表中的參數化名稱,如table_X。 X的值來自另一個表,所以例如在我的主表中,我有一列c_id和一列X,加入的表具有名稱table_X,它存在毫無疑問,它有相同的列c_id,其中I應加入,檢查該表中是否有c_id的值。參數化表名

  1. 我已經嘗試了看法,但沒有成功,因爲我不能在視圖中把一個參數表名。我可以參數化where子句和其他東西,但沒有表名。

  2. 我試過一個程序,用

    SET @q = CONCAT('select blabla from table_', X); 
    PREPARE stmt FROM @q; 
    EXECUTE stmt; 
    

    ,但過程不能返回值,我需要它,因爲我需要知道,如果沒有在參數表中的c_id值,否則它是無用的。

  3. 我已經嘗試了功能,但「動態SQL沒有包括在存儲函數或觸發允許」

所以我能做些什麼來提取這些數據?我從PHP調用這個視圖/函數/任何東西,並且我知道我可以從PHP端執行,有兩個查詢,但是我需要在db端執行,以供將來實現。 這可能嗎?

注意:我不能修改數據庫的結構:)順便說一句,這是Limesurvey分貝,聽起來像一個瘋狂的數據庫結構,是吧?

+0

聽起來像你需要重構你的數據庫以消除這些依賴關係。 – eykanal

回答

2

的唯一辦法,沒有動態建立查詢,是硬編碼在每一個組合,並挑選出你想要的。


如果表名是一個對存儲過程的參數,這可以是在IF塊。但感覺很笨拙。


如果從每個表中的字段是相同的,可以聯合的表一起,並從這些選擇...

CREATE VIEW myUnifiedStructure AS 
     SELECT 'Table1' AS tableName, * FROM Table1 
UNION SELECT 'Table2' AS tableName, * FROM Table2 
UNION SELECT 'Table3' AS tableName, * FROM Table3 
-- etc 

SELECT * FROM myUnifiedStructure WHERE tableName = 'Table1' 


如果字段是不同每個表格,您可能只對該領域的子集感興趣...

CREATE VIEW myUnifiedStructure AS 
     SELECT 'Table1' AS tableName, field1 AS field1, field4 AS field2 FROM Table1 
UNION SELECT 'Table2' AS tableName, field2 AS field1, field3 AS field2 FROM Table2 
UNION SELECT 'Table3' AS tableName, field2 AS field1, field4 AS field2 FROM Table3 
-- etc 


或者你可以傳遞NULL值給源表中不存在的字段......

CREATE VIEW myUnifiedStructure AS 
     SELECT 'Table1' AS tableName, NULL AS field1, field2 AS field2 FROM Table1 
UNION SELECT 'Table2' AS tableName, field1 AS field1, field2 AS field2 FROM Table2 
UNION SELECT 'Table3' AS tableName, field1 AS field1, NULL AS field2 FROM Table3 
-- etc 
+0

+1。打我吧 –

+1

不幸的是,表名也是動態的,所以我無法對它們進行硬編碼。但是,我知道是否以及何時創建了一個新表(實際上我創建了它們),所以我每次都可以動態刪除並重新創建視圖,這將做你建議的聯盟。很棒!Thx – Dippi

1

爲什麼你需要這樣的單獨表格?這通常是設計不好的標誌。創建一個帶有標識符字段的單個表,無論這個記錄屬於哪個X值,是不是更容易?您可以加入/過濾嗎?

那會查詢減少類似

SELECT ... 
FROM othertable 
JOIN bigtable ON othertable.c_id = bigtable.c_id AND othertable.fieldName = bigtable.fieldName 
+0

是啊,我知道,這是我第一次看到它時想的,但我並沒有設計數據庫,我知道遲早會有糟糕的設計會給我帶來問題...... :( – Dippi