2012-11-27 78 views
4

目前,得到我所需要的數據,我需要執行多個SQL語句:將多個SQL查詢

SELECT pubkey.pubkey_id 
FROM pubkey 
WHERE pubkey.pubkey_hash = (input data [1]) 

SELECT txin_corr.tx_id 
FROM txin_corr 
WHERE txin_corr.pubkey_id = (pubkey.pubkey_id from previous query [max. 1]) 

SELECT txin_corr.pubkey_id 
FROM txin_corr 
WHERE txin_corr.tx_id = (txin_corr.tx_id from prev.qry. [n]) 

SELECT pubkey.pubkey_hash 
FROM pubkey 
WHERE pubkey.pubkey_id = (txin_corr.pubkey_id from prev.qry. [n]) 

第一個查詢是沒有問題的,因爲我只有這樣做一次。但我想知道是否有辦法結合(至少)最後三個查詢。由於db非常大(〜20 GB),我認爲一個「好的查詢」可能會大大加快速度。

我做的是:對於給定的pubkey_id/pubkey_hash,從txin_corr的同一行中包含此pubkey_id得到所有tx_id秒。然後,從txin_corr獲得所有pubkey_id,其中該行包含檢索到的tx_id。最後,獲取現在檢索到的pubkey_id s的所有pubkey_hash

+1

我們在談論哪種RDBMS? SQL Server?甲骨文? MySQL的? – DOK

+0

我強烈建議使用更好的名稱,併爲此問題組裝一個可用的[sql小提琴](http://sqlfiddle.com/)示例。 –

+0

我正在使用MySQL 5.5。 – Micha

回答

2

較早的答案是正確的:關鍵是連接表在一起多次。但是,在那裏有一對多的關係,所以需要留下外部連接,而不僅僅是內部連接。

SELECT pk2.pubkey_hash 
FROM pubkey pk 
INNER JOIN txin_corr tc ON pk.pubkey_id = tc.pubkey_id 
LEFT OUTER JOIN txin_corr tc2 ON tc.tx_id = tc2.tx_id 
LEFT OUTER JOIN pubkey pk2 ON tc2.pubkey_id = pk2.pubkey_id 
WHERE pk.pubkey_hash = (input data) 
+0

這個作品 - 謝謝!還有一個問題:是否可以刪除重複的結果?即一個pubkey_hash目前可以出現多次,但是一次就足夠了。 – Micha

+1

當然,將DISTINCT添加到select:SELECT DISTINCT pk2.pubkey_hash .... – EvilBob22

0

這是一種方法。我不會斷言這是最有效的方法,但它應該可以在任何數據庫中工作。

訣竅是不止一次地連接到每個表格,並使用不同的前綴,因此您可以每次匹配不同的一組列。因此,您加入txin_corr以匹配最初的pubkey_id,然後再次加入以獲取相關ID的完整列表。然後回到'出'到pubkey來選擇匹配這個新的ID列表的記錄。

SELECT pk2.pubkey_hash 
FROM pubkey pk 
INNER JOIN txin_corr tc on pk.pubkey_id = tc.pubkey_id 
INNER JOIN txin_corr tc2 on tc.tx_id = tc2.tx_id 
INNER JOIN pubkey pk2 on tc2.pubkey_id = pk2.pubkey_id 
WHERE pk.pubkey_hash = (input data) 
0

這可能不是最好的方法,但你可以鏈接所有的選擇。如果任何一個查詢返回一個以上的結果,你可以改變從=關係模型中,並且將處理更多然後1個結果

SELECT pubkey.pubkey_hash 
FROM pubkey 
WHERE pubkey.pubkey_id = 
     (SELECT txin_corr.pubkey_id 
     FROM txin_corr 
     WHERE txin_corr.tx_id = 
       (SELECT txin_corr.tx_id 
       FROM txin_corr 
       WHERE txin_corr.pubkey_id = 
         (SELECT pubkey.pubkey_id 
         FROM pubkey 
         WHERE pubkey.pubkey_hash = (input data [1] 
         ) 
       ) 
     )