sql查询的问题,详见内容,求大神不腻赐教

公司的这个查询需要优化,不知道这段逻辑应该怎么写...
简化模型如下:
t表 有 a b c 三个字段
原sql为:
select * from t
where a = "配送"
and b = 2
union
select * from t
where a = "收款"
and c =2

能用一个select 语句搞定吗?

应用中表达的意思就是查询出来配送或者收款到达2这个阶段的订单

望大神不腻赐教 :oops:

300万只能是小表,随便哪个数据库都可以用or来完成,楼主多虑了。

select * from t where (a = '配送' and b = 2) or (a = '收款' and c =2)

[code="java"]select * from t
where (a = "配送"
and b = 2) or
(a = "收款"
and c =2 )[/code]

还有一个办法就是冗余状态,把你想要快捷查询出结果的状态,在增改时就写入额外的字段,这样只需要差一个字段,比如EX_STATUS:
0,未收款并且b=1,c=1
1,已收款并且b=1,c=1
。。。以此类推,可以在程序端写代码,也可以用触发器,这个其实是不太推荐的,复合状态并不应该是对象的直接属性。

对数据库也不是非常擅长。。。

数据少的话无所谓,or可能简单明了
300W条那应该是union效率高吧,or不走索引了,union每次单独查询可以走索引。具体时间自己对比下,个人觉得union效率高

如果能够保证“配送”和“收款”没有重复记录的话,使用Union All效率会高些:
select * from t
where a = "配送"
and b = 2
union all
select * from t
where a = "收款"
and c =2