【发布时间】:2021-02-11 14:58:57
【问题描述】:
我一直在努力研究如何将一个 select 语句内部连接到另一个 select 语句,以便按日期顺序返回特定项目的下一个值。我有许多表格来标识比赛会议、比赛和比赛参赛者,以及一个初始选择,用于确定赢得第一场比赛的参与者。每个种族会议包含多个种族,每个种族包含多个参赛者。在此实例中,我使用参与者唯一标识符 HorsePK 来识别我需要返回的记录。然后我试图实现的是在他们的下一场比赛和之后的比赛中确定他们的结果,但不是随后可能发生的比赛。也有参与者只完成了一场或两场比赛的情况,因此应排除这些记录。
最初的选择语句是:
Select RaceDate, HorsePK, HorseName, CareerRuns, FinishResult As ResultA
FROM [Punting].[dbo].[tblRace]
Inner Join tblRaceEntrant On tblRace.RacePK = tblRaceEntrant.RaceFK
Inner Join tblRaceMeeting On tblRace.RaceMeetingFK = tblRaceMeeting.RaceMeetingPK
Inner Join tblHorse On tblRaceEntrant.HorseFK = tblHorse.HorsePK
Where CareerRuns < 1 And FinishResult = 1
这工作正常并返回我期望的记录。当我尝试对第二条语句执行内部联接时,我的问题就出现了,我认为问题是因为我只想要该参与者按日期顺序的下一条记录。我认为语法类似于:
Select RaceDate, HorsePK, HorseName, CareerRuns, FinishResult As ResultA, ResultB
FROM [Punting].[dbo].[tblRace] t
Inner Join tblRaceEntrant On t.RacePK = tblRaceEntrant.RaceFK
Inner Join tblRaceMeeting On t.RaceMeetingFK = tblRaceMeeting.RaceMeetingPK
Inner Join tblHorse On tblRaceEntrant.HorseFK = tblHorse.HorsePK
Inner Join (Select Top (1) FinishResult As ResultB
FROM [Punting].[dbo].[tblRace] t1
Inner Join tblRaceEntrant On t1.RacePK = tblRaceEntrant.RaceFK
Inner Join tblRaceMeeting On t1.RaceMeetingFK = tblRaceMeeting.RaceMeetingPK
Inner Join tblHorse On tblRaceEntrant.HorseFK = tblHorse.HorsePK
Order By RaceDate Desc) On t.HorsePK = t1.HorsePK
Where CareerRuns < 1 And FinishResult = 1
这将返回错误“关键字“On”附近的语法不正确。”并引用 'Order By RaceDate Desc) On t.HorsePK = t1.HorsePK'。我真的不知道为什么这是错误的,或者它是否会返回我期望的记录,这就是我需要帮助的地方。
为了复合这一点,我认为我需要在嵌套的内部联接中添加另一个内部联接,以便也为该参与者获取第三行。我试图实现的最终输出如下所示:
RaceDate,HorsePK,HorseName,CareerRuns,ResultA,ResultB,ResultC
2017-03-12,52352,Just Hifalutin,0,1,4,2
2018-01-02,52837,Daunting Duchess,0,1,1,8
2017-07-16,53319,Yurilla,0,1,9,3
2017-04-25,53427,Maria Elisa,0,1,4,1
我不是特别精通 SQL 服务器(显然),但我相信这是返回这些结果的更好方法,而不是使用游标(我知道但不精通)。我应该这样做吗?
不是为每个涉及的表粘贴 DDL,因为它是相当多的数据,这些是使用马 ID 的表的编辑版本:
CREATE TABLE [dbo].[tblHorse](
[HorsePK] [int] IDENTITY(1,1) NOT NULL,
[HorseName] [nvarchar](250) NOT NULL,
[SireFK] [int] NULL,
[DamFK] [int] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[tblRaceEntrant](
[RaceEntrantPK] [int] IDENTITY(1,1) NOT NULL,
[RaceFK] [int] NOT NULL,
[EntrantNumber] [int] NOT NULL,
[HorseFK] [int] NOT NULL,
[Age] [int] NULL,
[Gender] [varchar](5) NULL,
[FinishResult] [int] NULL
) ON [PRIMARY]
tblHorse 的示例数据如下所示:
HorsePK HorseName SireFK DamFK
77447 Scorpius 739 15383
84803 One Job 777 633
84815 Hooroo Lads 132 9797
84841 Ingear 766 21204
84884 Platinum Euros 143 11723
84889 Cryptic Wonder 211 17758
84912 Tricky Gal 90 19918
108448 Grey Detective 278 17515
109291 Nostradam Man 1347 6955
109319 Piccadilly Waltz 9 29848
tblRaceEntrant 的示例代码如下所示:
RaceEntrantPK RaceFK EntrantNumber HorseFK Age Gender FinishResult
67 10635 14 77447 2 C 1
355 27 8 84803 2 F 1
694 66 8 84841 2 F 1
845 82 8 84815 2 G 1
1342 129 3 84884 2 G 1
1841 179 8 84889 2 G 1
2082 203 6 84912 3 M 1
5163 510 7 84841 2 F 3
5236 517 2 84815 2 G 10
8574 871 3 84889 2 G 2
10062 1026 1 84912 3 M 1
27640 2824 3 84912 4 M 2
36037 3673 5 84912 4 M 1
42829 4401 7 84912 4 M 1
49460 5110 1 84912 4 M 2
60466 6290 8 84841 3 F 14
62017 6453 11 77447 3 C 2
67086 6975 18 84841 3 F 8
71604 7450 10 77447 3 C 1
76138 7921 7 84841 3 F 5
77838 8102 1 77447 3 C 4
84153 8761 4 84841 3 F 2
85015 8843 4 77447 3 C 5
114210 11756 6 77447 2 C 7
505957 52335 10 84841 3 F 3
508693 52635 3 84889 3 G 1
511758 52943 15 84841 3 F 1
516101 53391 8 84884 3 G 1
518339 53625 1 84889 3 G 2
521441 53947 12 84841 3 F 3
537301 55557 4 84912 4 M 1
545700 56358 2 84912 4 M 6
561458 59583 11 84912 4 M 3
569822 60358 2 77447 3 G 2
572503 60587 4 84912 4 M 2
575946 60853 9 77447 3 G 8
580109 61296 9 77447 3 G 3
580253 61310 9 84912 4 M 7
587297 61953 6 77447 3 G 5
603412 63355 3 77447 4 G 10
608617 63805 9 84841 4 M 2
615265 64429 4 77447 4 G 2
618260 64741 3 77447 4 G 5
623080 65235 3 84912 5 M 1
625750 65507 3 108448 3 C 1
630404 65993 3 84912 5 M 5
635248 66478 4 109291 3 G 1
635604 66517 7 109319 3 0 1
635652 66522 7 108448 3 C 9
637189 66679 10 84912 5 M 5
638846 66857 5 109291 3 G 10
我尝试按照建议将外部选择修改为 Select t.HorsePK 而不是 Select HorsePK,但这并没有解决错误。
【问题讨论】:
标签: sql-server stored-procedures inner-join