Sql server 两次联接表时重复列

Sql server 两次联接表时重复列,sql-server,Sql Server,当我两次连接一个表以从表2中获取不同的数据时,如果表2中获取不同的行计数数据,则某些列将重复 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.

当我两次连接一个表以从表2中获取不同的数据时,如果表2中获取不同的行计数数据,则某些列将重复

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
我得到了这个资源

试试这个:

;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'
收集数据,第二个CTE为
section='laminate1'
收集数据。我们加上行号()。然后加入两个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

如果您显示您的初始表格和所需表格会更好谢谢@gofr1,但有没有缩短的方法可以做到这一点,我应该在另一个更大的代码中使用这些代码,我应该使用这5次和表顺序中的另一列,它们变得越来越大。我再添加一种方法,请尝试一下。谢谢@gofr1,但我在搜索另一种方法,而不是使用cte,还有其他方法吗?使用视图代替CTE。我认为没有更多的方法可以实现ROW_NUMBER()功能。