Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
组合多个SQL查询_Sql_Optimization_Database Performance - Fatal编程技术网

组合多个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

目前,为了获得所需的数据,我需要执行多个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])
第一个查询没有问题,因为我只需要做一次。但我想知道是否有办法(至少)组合最后三个查询。由于数据库相当大(约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_散列当前可以出现多次,但一次就足够了。