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:

yeluochengshang
yeluochengshang 关键是要提高查询的性能,t表数据量大概在300W条的样子
6 年多之前 回复

6个回答

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

yeluochengshang
yeluochengshang 查询慢的原因不在于这个地方,在于数组库字段的设计的不合理导致的,需要进行多表关联查询,而且其中大概有2个表的数据量都是在300W的样子,而且查询条件中有一个 where 某字段 in(这里大概100个不同的字符串), 当然最核心的问题还是数据库设计的问题...改模型要动大手术啊,悲催ing
6 年多之前 回复

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]

zengjianhua2011
zengjianhua2011 用 or 的效率不高
6 年多之前 回复

还有一个办法就是冗余状态,把你想要快捷查询出结果的状态,在增改时就写入额外的字段,这样只需要差一个字段,比如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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!