sql根据2列进行查询(确定唯一性)

场景

例如代码,号码共同确定唯一性。 突然有个变态的需求,入参要10对代码和号码。

解决方案

错误的写法

要特别注意,如下写法是错的,因为这样查出来的数据会多:

inv_kind in () and inv_num in ()

无论如何这2个条件要并列,以下几种写法都可。

多对条件or实现

select * from t_ticket
where (inv_kind='3100191130' and inv_num ='30656462')
or (inv_kind='021021600111' and inv_num ='12588351')
or (inv_kind='050001500111' and inv_num ='27884930')

union 来实现

select * from t_ticket where (inv_kind='3100191130' and inv_num ='30656462')
union select * from t_ticket where (inv_kind='021021600111' and inv_num ='12588351')
union select * from t_ticket where (inv_kind='050001500111' and inv_num ='27884930')

多列in实现

select * from t_ticket 
where (inv_kind,inv_num) 
in (('3100191130','30656462'),('021021600111','12588351'),('050001500111','27884930'))

其他

各种实现都不是很优雅,只能说这样的需求太变态。

解决in的另外一种方案

如果in的数量实在多,每次都手动拼,有一定的缺陷。
1、in 多条的话,超过一定数量,会非常影响性能。
2、如果有几千条,那么1次200条。也要执行很多次。

一种方案

新建一个表或者视图,把数据放进去,然后进行关联查询。
1、数据量大一些也没有关系。
2、多列的处理也不太费事。
如果in的数据固定了,这种方式不错。 如果是动态的数据,那么还是手动拼吧。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值