如何将指定的LEFT JOIN SQL查询改写为子查询形式?
改写为子查询形式的SQL
SELECT o.hash, o.index, o."timestamp" AS created_timestamp, -- 从i表获取消费时间,无匹配返回NULL (SELECT i."timestamp" FROM i WHERE i.spent_hash = o.hash AND i.spent_index = o.index) AS spent_timestamp, -- 从i表获取消费区块号,无匹配返回NULL (SELECT i.number FROM i WHERE i.spent_hash = o.hash AND i.spent_index = o.index) AS spent_number, o.number AS created_number, o.value, -- 获取创建时的USD汇率 (SELECT usd FROM blocks b WHERE b.number = o.number) AS created_usd, -- 获取消费时的USD汇率,无匹配返回NULL (SELECT usd FROM blocks b WHERE b.number = (SELECT i.number FROM i WHERE i.spent_hash = o.hash AND i.spent_index = o.index)) AS spent_usd FROM o
逻辑说明
这个查询和原LEFT JOIN版本的结果完全等价:
- 原查询中
LEFT JOIN i的匹配逻辑,被拆分为每个字段的相关子查询,当没有找到对应的i记录时,子查询会返回NULL,和LEFT JOIN的行为一致。 - 最后一个关联blocks的子查询嵌套了一层,用来先获取对应i表的区块号,确保在没有匹配i记录时,该字段也返回
NULL,和原逻辑保持一致。
内容的提问来源于stack exchange,提问作者ATB
相关产品推荐
相关产品推荐

