2013-05-17 80 views
1

我有一條SQL語句必須從兩個數據庫中提取信息,一個是常量和已知數據庫,另一個是在第一個數據庫中動態找到的。該數據庫的結構是這樣的:從JOIN中的值中選擇一個數據庫

  • (數據庫)查找
    • (表)測試
      • (場)鍵,數據庫名稱
      • (行樣品) 「富」, 「database_foo」
  • (數據庫)database_foo
    • (表)酒吧
      • (場)important1,important2
      • (行樣品) 「傻」, 「測試」

所以我的SQL語句如下所示:

SELECT 
    test.key as key, 
    test.database_name as database_name, 
    bar.important1 as important1, 
    bar.importnat2 as important2, 
FROM 
    lookup.test as test, 
    (database_name).bar as bar, # this, obviously, doesn't work 
WHERE 
    key = 'foo' 
LIMIT 1; 

有沒有辦法讓我做這項工作,還是對我來說只是做兩件事更好?單獨的SQL語句,一個用於查找,另一個用於數據庫?

回答

1

如果你必須這樣做,那麼你需要使用動態sql 兩個語句。

您將查詢構建爲字符串,然後在查詢構建完成後對查詢運行EXEC

在這種情況下,你將有一個字符串變量的數據庫名稱,那麼你會創建一個查詢從這個變量和你的字面查詢,然後你會簡單地執行它。

但請注意,如果您不控制輸入參數,這會使您容易受到SQL注入的攻擊。

厄蘭Sommarskog對使用動態SQL一個偉大的底漆:

http://www.sommarskog.se/dynamic_sql.html

編輯:從下面@BryanMoyle評論,你可能會需要做兩件事一個單獨的查詢動態SQL。您需要提取值才能確定其他數據庫名稱...因爲您不能使用數據庫名稱作爲變量,所以您首先需要SELECT此信息,然後將其粘貼到後續查詢中。

+0

我寫了這個評論,然後意識到,這將不會爲他工作,因爲動態值是構造是從連接中提取的,它以前是未知的 – Bryan

+0

@BryanMoyles他必須做兩個**然後,一個單獨的查詢來查找他需要的值*和*動態sql來更改查詢中的數據庫名稱。 – Matthew

1

我個人去了兩個單獨的陳述;它可以更容易地控制錯誤,例如查找提供了一行,該行提供了有效的數據庫等。

正如馬修指出的,提防SQLIA並清理所有用戶輸入。我喜歡MD5哈希輸入,並與查找值的哈希進行比較。

0

我會去尋找由php介導的兩個單獨的查詢:它更簡單,更強大,並且會讓你保持清醒和高效。寫一個查詢來找出你應該與哪個數據庫交談。使用PHP(不SQL)來查詢引導到該數據庫:

$row = $lookup->prepare("SELECT database_name WHERE key = 'foo'")->execute()->fetch(); 
$db = $row[0]; 

再和您聯繫$db,並要求與關鍵foo行。使用PHP代碼選擇正確的開放連接,或者切換與USE連接內部數據庫:

$query2 = "USE " . $db . "; SELECT * FROM bar where key == 'foo'"