繁体   English   中英

优化复杂的SQL查询

[英]Optimize complicated SQL query

抱歉,如果这很明显,但我对SQL并不擅长。 我有几个表都需要连接,但其中一个列可以为null。

我有这个问题:

select orders.ordnum, orders.tstamp, orders.sku, code, redeemed_order_num, null as redeemed_date, null as fullname
from customer_subscriptions orders
join bulk_codes codes
    on codes.bulk_order_id = orders.subscription_id
where (orders.sku="bulk-box" or orders.sku="bulk-book") and redeemed_order_num is null
union
select orders.ordnum, orders.tstamp, orders.sku, code, redeemed_order_num, redeemed_orders.date redeemed_date, customers.fullname
from customer_subscriptions orders
join bulk_codes codes
    on codes.bulk_order_id = orders.subscription_id
join customer_subscriptions redeemed_orders
    on codes.redeemed_order_num = redeemed_orders.ordnum
join customers
    on customers.cid = redeemed_orders.cid
where (orders.sku="bulk-box" or orders.sku="bulk-book")

顶部选择返回前9行,底部返回一行。

结果: 结果截图

有什么方法可以优化吗?

完整的架构在这里: https//pastebin.com/FXGLetcV

我想你只需要left join

SELECT orders.ordnum, orders.tstamp, orders.sku, code,
       redeemed_order_num, redeemed_orders.date redeemed_date, customers.fullname
FROM customer_subscriptions orders JOIN
     bulk_codes codes
     ON codes.bulk_order_id = orders.subscription_id LEFT JOIN
     customer_subscriptions redeemed_orders
     ON codes.redeemed_order_num = redeemed_orders.ordnum LEFT JOIN
     customers
     ON customers.cid = redeemed_orders.cid
WHERE orders.sku IN ('bulk-box', 'bulk-book')

以下是查询。

         Select orders.ordnum, orders.tstamp, orders.sku, code, redeemed_order_num, null as redeemed_date, null as fullname
           From customer_subscriptions orders
     Inner join bulk_codes codes 
             On codes.bulk_order_id = orders.subscription_id 
            And redeemed_order_num is null -- comment
Left outer join bulk_codes codes 
             On codes.bulk_order_id = orders.subscription_id
left outer join customer_subscriptions redeemed_orders 
             On COALESCE(codes.redeemed_order_num, 111111) = redeemed_orders.ordnum
left outer join customers 
             On customers.cid = redeemed_orders.cid
          where orders.sku='bulk-box' 
             Or orders.sku='bulk-book'

在您给出的查询中,首先选择仅​​加入具有空值的redeemed_order_num,并且在第二个选择中加入redeemed_order_num,使用coalesce或IFNULL函数替换连接条件中的空值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM