组合多个SQL查询
目前,为了获得所需的数据,我需要执行多个SQL语句:组合多个SQL查询,sql,optimization,database-performance,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
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])
第一个查询没有问题,因为我只需要做一次。但我想知道是否有办法(至少)组合最后三个查询。由于数据库相当大(约20GB),我认为一个“好的查询”可能会大大加快速度
我所做的是:对于给定的
pubkey\u id
/pubkey\u hash
,从txin\u corr
获取所有tx\u id
中的。然后,从txin_corr
获取所有pubkey_id
s,其中行包含检索到的tx_id
s。最后,为现在检索到的pubkey\u id
s获取所有pubkey\u散列。我不会断言这是最有效的方法,但它应该适用于任何数据库
诀窍是使用不同的前缀多次连接到每个表,因此每次都可以针对不同的列集进行匹配。因此,您加入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)
这可能不是最好的方法,但您可以将所有选择链接在一起。如果任何查询返回多个结果,您可以将关系从=更改为in,这将处理多个结果
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]
)
)
)
前面的答案是正确的:关键是多次将表连接在一起。但是,其中存在一对多关系,因此需要留下外部连接,而不仅仅是内部连接
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)
我们在这里讨论的是哪些关系数据库管理系统?SQL Server?神谕MySQL?我强烈建议使用更好的名称,并为这个问题提供一个工作示例。这很有效-谢谢!还有一个问题:是否可以删除重复的结果?即,一个pubkey_散列当前可以出现多次,但一次就足够了。