4

目前,要获取我需要的数据,我需要执行多个 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,从中获取所有包含 this在同一行中的tx_ids 。然后,从包含检索到的 s 的行中获取所有s 。最后,获取现在检索到的 s 的所有s。txin_corrpubkey_idpubkey_idtxin_corrtx_idpubkey_hashpubkey_id

4

3 回答 3

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)
于 2012-11-27T23:00:09.843 回答
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)
于 2012-11-27T19:20:39.320 回答
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]
                         )
                 )
         )
于 2012-11-27T19:47:32.670 回答