Sql server 内部联接select语句以按日期查找下一条记录
我一直在努力解决如何将一个select语句内部联接到另一个select语句,以便按日期顺序返回特定项的下一个值。我有许多表格,用于确定比赛、比赛和参赛者,以及确定赢得第一场比赛的参与者的初始选择。每场比赛包含多场比赛,每场比赛包含多个参赛者。在本例中,我使用参与者唯一标识符HorsePK来标识需要返回的记录。然后我试图实现的是确定他们在下一场比赛和之后的比赛中的成绩,而不是anu随后可能发生的比赛。也会有参与者仅完成一场或两场比赛的情况,因此应排除这些记录 最初的select语句是:Sql server 内部联接select语句以按日期查找下一条记录,sql-server,stored-procedures,inner-join,Sql Server,Stored Procedures,Inner Join,我一直在努力解决如何将一个select语句内部联接到另一个select语句,以便按日期顺序返回特定项的下一个值。我有许多表格,用于确定比赛、比赛和参赛者,以及确定赢得第一场比赛的参与者的初始选择。每场比赛包含多场比赛,每场比赛包含多个参赛者。在本例中,我使用参与者唯一标识符HorsePK来标识需要返回的记录。然后我试图实现的是确定他们在下一场比赛和之后的比赛中的成绩,而不是anu随后可能发生的比赛。也会有参与者仅完成一场或两场比赛的情况,因此应排除这些记录 最初的select语句是: Selec
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
显然,我对SQL server不是特别精通,但我相信这是一种比使用我知道但不精通的游标更好的返回这些结果的方法。我还有别的办法吗
这些是使用马ID的表格的编辑版本,而不是为每个涉及的表格粘贴DDL,因为它是相当多的数据:
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
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
tblRaceEntrant的示例代码如下所示:
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
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
我尝试修改外部选择以选择t.HorsePK,而不是按照建议选择HorsePK,但这并没有解决错误。在我的示例中,您需要为子查询tx添加别名,然后使用此别名加入。另外,由于您希望在t1.HorsePK上加入,因此需要在子查询中选择它
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, t1.HorsePK /* <-- select anything you need outside of this subquery */
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) tx On t.HorsePK = tx.HorsePK /* <-- Give an alias to you subquery and join on this alias*/
Where CareerRuns < 1 And FinishResult = 1
我认为这一逻辑对我来说是有意义的,但它返回的错误是无效的列名“HorsePK”。对于此字段的每个引用。我将查询分解为一个select语句,以确保返回该字段并且该字段工作正常,因此我假设问题与查询中如何引用该字段有关。它还在内部联接语句“on t.HorsePK=tx.HorsePK”上返回不明确的列名“HorsePK”。有什么想法吗?请您编辑您的问题并附加表的DDL和一些示例数据好吗?含糊不清的列错误可能来自您的外部选择。选择t.HorsePK而不是选择HorsePK。