结合多个SQL查询

时间:2012-11-27 19:11:11

标签: sql optimization database-performance

目前,为了获取我需要的数据,我需要执行多个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])

第一个查询没问题,因为我只需要做一次。但我想知道是否有办法结合(至少)最后三个查询。由于数据库相当大(约20 GB),我认为“好的查询”可能会大大加快速度。

我正在做的是:对于给定的pubkey_id / pubkey_hash,请同时包含此tx_id的{​​{1}}中的所有txin_corr行。然后,从pubkey_id获取所有pubkey_id,其中该行包含检索到的txin_corr。最后,获取现在检索到的tx_id的所有pubkey_hash

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

这是一种方式。我不会断言这是最有效的方法,但它应该适用于任何数据库。

技巧是不止一次加入每个表,使用不同的前缀,因此每次都可以匹配不同的列集。因此,您加入txin_corr以匹配初始pubkey_id,然后再次加入它以获取相关ID的完整列表。然后将'out'连接回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)

答案 2 :(得分:0)

这可能不是最好的方法,但您可以将所有选择链接在一起。如果任何查询返回多于一个结果,您只需将关系从=更改为in并且将处理多于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]
                         )
                 )
         )