我有一个由以下结构和记录组成的表,我想要做的只是提取那些状态id为1或2的记录的orderid,我想要排除所有orderid = statusid = 3的orderid,问题是orderid 106同时具有状态1和3 ...... 我写了一个用于此目的的子查询..
select *
from orders_status_history
where orders_id NOT IN
(select orders_id
from orders_status_history
where orders_status_id = 3)
有没有其他方法可以不使用子查询,因为我听说它会妨碍性能。因为我的查询也可以返回数千行。
id order-id status-id
1 1 1
2 2 1
3 105 1
4 106 1
5 106 3
6 108 1
7 109 1
8 109 2
任何帮助或建议都将受到高度赞赏..谢谢提前..
答案 0 :(得分:4)
您可以这样做:
SELECT osh.*
FROM orders_status_history osh
LEFT JOIN
orders_status_history oshd
ON oshd.orders_id = osh_orders_id
AND oshd.orders_status_id = 3
WHERE oshd.orders_id IS NULL
但是,如果您在order_status_history (orders_id, orders_status_id)
上有索引,那么NOT IN
查询就可以了。
您可能需要阅读此内容:
答案 1 :(得分:0)
我想知道为什么你使用子查询,而你可以使用以下查询
select orders_id from orders_status_history where orders_status_id <> 3
请试试这个,我希望有所帮助