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