sqlserver多对多查询的实例(含代码)

背景如图:需要查询出每一个内部编号对应的设备在系统中的最新状态,主表为A
sqlserver多对多查询的实例(含代码)
其中B表只含有其对应的编号,但是没有状态
sqlserver多对多查询的实例(含代码)
其中C表中含有其对应的状态,但时含有多条状态,我们需要取其中最新的时间节点做为最新状态展示出去
sqlserver多对多查询的实例(含代码)
sqlserver多对多查询的实例(含代码)
大致类型如上图(灵魂画师),A中的1234分别需要查询C中的对应最新的状态
思路如下,从C表中做筛选,先筛选出最新的时间状态件,把他化作一个视图

select  * from
(    select
                    计划生产.工序,
                    制表日期,
                    计划生产.订单细则号,
					case when len(substring(计划投产.内部编号, 5, 30))<6
					then rtrim(ltrim(内部编号))
				else substring(计划投产.内部编号, 5, 30) 
					end as 内部编号,
                    row_number() over(partition
                by
                    内部编号
                order by
                    制表日期 desc) num
               from
                    计划生产
                left join
                   计划投产
                        on 计划生产.订单细则号 =计划投产.细则号)v
            where
                v.num=1

每次查询都需要对这个视图进行一次拼接才能将所有的状态都查出来

select
        审批人,
        序号,
        b.工序 as 工序5,
        制表人,
        case
            when '审批人' is not null     then '审批通过'
            when '审批人' is null     then  '审批中'
        end as 审批状态
    from
        新模型结构评审表
    left join
        在制工序 b
            on b.内部编号=内部编号5
    where
        是否需要展示 is null

如果有多个状态,则需要多次进行拼接