首页 > 解决方案 > 找到第一场比赛

问题描述

我有两个大致像这样的表(仅包括相关信息):

------------ Master --------------
ID | Master_Number | First_Arrival
---------- Vehicle ------------
ID | Master_ID | Name | Arrived

在上面,Vehicle.Master_ID是一个 FK 到Master.ID

我创建了一个像这样的表变量:

declare @foo table (Master_Number varchar(20), First_Arrival datetime, Name varchar(20), Arrived datetime)

insert into
@foo
select
    M.Master_Number,
    M.First_Arrival,
    V.Name,
    V.Arrived
from
    Master as M
inner join
    Vehicle as V
on
    V.Master_ID = I.ID
order by M.Master_Number, V.Arrived

这给了我一个很好的列表,列出了与相同 Master_Number 相关的所有车辆,以及它们到达的顺序。

我试图做的是得到这样的东西:

--------------------------------------------- Result --------------------------------------------------
Master_Number | First_Arrival | Vehicle_1_Name | Vehicle_1_Arrived | Vehicle_2_Name | Vehicle_2_Arrived

排序在哪里Vehicle_1_Arrived < Vehicle_2_Arrived, Vehicle_1_Name like '[ETL]%', 和'Vehicle_2_Name like '[TL]%'

我遇到的问题是可能有零个或多个车辆与 a 相关联Master_ID,我只希望每一行都是与此完全匹配的第一个结果,而忽略与 that 相关的任何其他车辆Master_ID以及任何null值。

我是 SQL 的新手,无法解决这个问题....任何帮助将不胜感激。

标签: sqlsql-servertsql

解决方案


这是一个非常好的候选人apply

select M.Master_Number, M.First_Arrival, v1.Name, v1.Arrived,
       v1.Name, v2.Arrived
from Master m cross apply
     (select top (1) v1.*
      from Vehicle v1
      where v.Master_ID = I.ID and v1.Name like '[ETL]%'
      order by v1.arrived
     ) v1 cross apply
     (select top (1) v2.*
      from Vehicle v2
      where v2.Master_ID = I.ID and v2.Name like '[TL]%' and
            v2.arrived > v1.arrived
      order by v2.arrived asc
     ) v2
order by M.Master_Number;

apply实现横向连接,这很像相关子查询,除了它可以返回多列和/或多行。


推荐阅读