日期:2014-05-16  浏览次数:20639 次

条件可选的两个表用OR连接起来查询,记录出现重复,求救...
订单表:
订单编号、目的国、运输方式、订单尾号

箱唛表:
编号、目的国、运输方式、订单尾号、箱唛规则【目的国+订单尾号、目的国+运输方式】


现在用一句SQL将订单表和箱唛表连接起来查询、难点在 箱唛表的条件可选;就是优先使用 目的国+订单尾号 去和订单表连接,如果没有记录再用 目的国+运输方式 去和订单表连接。

我现在是这样用的:
select  *  from 订单表 a 
inner join 箱唛表 b   on (a.目的国= b.目的国 and a.订单尾号=b.订单尾号 and b.箱唛规则=【目的国+订单尾号】)  or   (a.目的国= b.目的国 and a.运输方式=b.运输方式 and  b.箱唛规则=【目的国+运输方式】)  

现在记录出现重复,我希望他能满足了第一个条件 就不要再查第二个了。。。。。。。。。。。
------解决方案--------------------
为什么不能用distinct
------解决方案--------------------
这样写呢?

select  *  from 订单表 a 
inner join 箱唛表 b   on 
(a.目的国= b.目的国 and a.订单尾号=b.订单尾号 and b.箱唛规则=【目的国+订单尾号】)  
or  
(a.目的国= b.目的国 and a.订单尾号<>b.订单尾号 and a.运输方式=b.运输方式 and  b.箱唛规则=【目的国+运输方式】)  
------解决方案--------------------
你一个订单有几个箱唛规则啊,如果一个订单只对应一个箱唛规则,那怎么会出现重复呢
有没有模拟数据,发来看看
------解决方案--------------------
那么两种改法,简单该法是别抽箱唛规则字段,然后distinct去重复
复杂点的是对你抽出来的结果集以订单编号分组做rownumber over partition by,然后取rownumber为1的一条数据
------解决方案--------------------
--看你需求,是不能用 Or 的,这么写试试,union all 对应的字段不能用*,用啥你自己调节
with t as (
select  *  ,1 sort
from 订单表 a 
inner join 箱唛表 b   on (a.目的国= b.目的国 and a.订单尾号=b.订单尾号 and b.箱唛规则=【目的国+订单尾号】)  
union all
select  *  ,2 sort
from 订单表 a 
inner join 箱唛表 b   on (a.目的国= b.目的国 and a.运输方式=b.运输方式 and  b.箱唛规则=【目的国+运输方式】)  
),tt as (
select *,rn=ROW_NUMBER(partition by a.订单编号 order by sort)
from t 
)
select * from tt where tt.rn=1