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的数据固定了,这种方式不错。 如果是动态的数据,那么还是手动拼吧。

你可能感兴趣的:(oracle)