2016-10-04 55 views
1

当我连接表时两次从表二得到不同的数据,如果表二得到不同的行数数据某一列是重复的。重复列时两次连接表

select 
o.order_no 
,sr.reason as reason1 
,datediff(minute,s.begin_stop,s.end_stop) as s1 
,sr2.reason as reason2 
,datediff(MINUTE,s2.begin_stop,s2.end_stop) as s2 
from [order] o 
left join [stops] s on s.order_id=o.id and s.section='print' 
join [stopreason] sr on s.error_code=sr.code 
left join [stops] s2 on s2.order_id=o.id and s2.section='laminate1' 
join [stopreason] sr2 on sr2.code=s2.error_code 
where datepart(ww,o.date_onexit)=39 
order by order_no 

和我得到这个resoult

enter image description here

+0

更好,如果你显示你的初始表和所需的表 –

回答

1

试试这个:

;WITH part1 AS (
    select o.order_no, 
      sr.reason as reason1, 
      datediff(minute,s.begin_stop,s.end_stop) as s1, 
      ROW_NUMBER() OVER (PARTITION BY o.order_no ORDER BY o.order_no) rn 
    from [order] o 
    left join [stops] s 
     on s.order_id=o.id and s.section='print' 
    join [stopreason] sr 
     on s.error_code=sr.code 
    where datepart(ww,o.date_onexit)=39 
), part2 AS (
    select o.order_no, 
      sr2.reason as reason2, 
      datediff(MINUTE,s2.begin_stop,s2.end_stop) as s2, 
      ROW_NUMBER() OVER (PARTITION BY o.order_no ORDER BY o.order_no) as rn 
    from [order] o 
    left join [stops] s2 
     on s2.order_id=o.id and s2.section='laminate1' 
    join [stopreason] sr2 
     on sr2.code=s2.error_code 
    where datepart(ww,o.date_onexit)=39 
) 

SELECT p1.order_no, 
     p1.reason1, 
     p1.s1, 
     p2.reason2, 
     p2.s2 
FROM part1 p1 
LEFT JOIN part2 p2 
    ON p1.order_no = p2.order_no AND p1.rn = p2.RN 
order by p1.order_no 

首先CTE(part1)为section='print'收集数据,第二 - 为section='laminate1'。我们添加ROW_NUMBER()。然后加入两个CTE。

另一种方式:

;WITH part1 AS (
    select o.order_no, 
      sr.reason as reason, 
      datediff(minute,s.begin_stop,s.end_stop) as s, 
      s.section, 
      ROW_NUMBER() OVER (PARTITION BY o.order_no,s.section ORDER BY o.order_no) rn 
    from [order] o 
    left join [stops] s 
     on s.order_id=o.id and (s.section='print' or s.section='laminate1') 
    join [stopreason] sr 
     on s.error_code=sr.code 
    where datepart(ww,o.date_onexit)=39 
) 

SELECT p1.order_no, 
     p1.reason1, 
     p1.s1, 
     p2.reason2, 
     p2.s2 
FROM part1 p1 
LEFT JOIN part1 p2 
    ON p1.order_no = p2.order_no AND p1.rn = p2.RN AND p2.section='laminate1' 
WHERE p1.section='print' 
order by p1.order_no 
+0

感谢@ gofr1但没有任何缩减的方式做到这一点,我应该在另一个更大的代码中使用此代码,我应该使用这5次和从表格顺序的另一列变得越来越大 –

+0

我再加一个方法,请试试看。 – gofr1

+0

谢谢@ gofr1但我寻找一种不同的方式,不使用cte,有没有另一种方式? –