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