跨不同表的多个 SELECT UNION 语句

时间:2021-05-06 13:40:29

标签: sql

嘿伙计们,请在下面查看我当前的代码:

    SELECT a.*, b.Attendance, b.Duration
  FROM [NCAAF].[dbo].[NCAAF_MASTER_GAME_ODDS] a
  LEFT JOIN (SELECT DISTINCT Game_Code, Attendance, Duration
  from [NCAAF].[dbo].[game-statistics2018]) b
  ON a.Game_Code = b.Game_Code
  WHERE a.Date BETWEEN '20180701' AND '20190301'
UNION
SELECT a.*, c.Attendance, c.Duration
  FROM [NCAAF].[dbo].[NCAAF_MASTER_GAME_ODDS] a
  LEFT JOIN (SELECT DISTINCT Game_Code, Attendance, Duration
  from [NCAAF].[dbo].[game-statistics2019]) c
  ON a.Game_Code = c.Game_Code
  WHERE a.Date BETWEEN '20190701' AND '20200301'
UNION
SELECT a.*, d.Attendance, d.Duration
  FROM [NCAAF].[dbo].[NCAAF_MASTER_GAME_ODDS] a
  LEFT JOIN (SELECT DISTINCT Game_Code, Attendance, Duration
  from [NCAAF].[dbo].[game-statistics2020]) d
  ON a.Game_Code = d.Game_Code
  WHERE a.Date BETWEEN '20200701' AND '20210301'

这段代码让我得到以下结果:

[编码前的图片]

1

我现在想从另一个表中映射更多字段(Rush_Att、Rush_Yard),以便您可以看到我在底部添加了它:

SELECT a.*, b.Attendance, b.Duration
  FROM [NCAAF].[dbo].[NCAAF_MASTER_GAME_ODDS] a
  LEFT JOIN (SELECT DISTINCT Game_Code, Attendance, Duration
  from [NCAAF].[dbo].[game-statistics2018]) b
  ON a.Game_Code = b.Game_Code
  WHERE a.Date BETWEEN '20180701' AND '20190301'
UNION
SELECT a.*, c.Attendance, c.Duration
  FROM [NCAAF].[dbo].[NCAAF_MASTER_GAME_ODDS] a
  LEFT JOIN (SELECT DISTINCT Game_Code, Attendance, Duration
  from [NCAAF].[dbo].[game-statistics2019]) c
  ON a.Game_Code = c.Game_Code
  WHERE a.Date BETWEEN '20190701' AND '20200301'
UNION
SELECT a.*, d.Attendance, d.Duration
  FROM [NCAAF].[dbo].[NCAAF_MASTER_GAME_ODDS] a
  LEFT JOIN (SELECT DISTINCT Game_Code, Attendance, Duration
  from [NCAAF].[dbo].[game-statistics2020]) d
  ON a.Game_Code = d.Game_Code
  WHERE a.Date BETWEEN '20200701' AND '20210301'
UNION
SELECT a.*, e.Rush_Att, e.Rush_Yard
  FROM [NCAAF].[dbo].[NCAAF_MASTER_GAME_ODDS] a
  LEFT JOIN (SELECT DISTINCT Team_Code, Game_Code, Rush_Att, Rush_Yard
  from [NCAAF].[dbo].[team-game-statistics2018]) e
  ON a.Game_Code = e.Game_Code AND a.[Team Code] = e.Team_Code
  WHERE a.Date BETWEEN '20180701' AND '20190301'

当我运行它时,我得到以下结果:

[代码后图]

2 您可以看到它没有映射到新列,而是将值映射到出勤和持续时间列。一个例子是前两条记录。出勤 31007 和持续时间 193 对这场比赛是正确的,但 25 是 Rush_Att 号码,116 是 Rush_Yard 号码。我在这里做错了什么?我该如何解决?提前谢谢你。真的很感谢。

1 个答案:

答案 0 :(得分:0)

如果您希望它们作为单独的列,那么您需要将它们作为 null 添加到您的其他联合语句中,如下所示:

SELECT a.*, b.Attendance, b.Duration , NULL as Rush_Att, NULL as Rush_Yard
  FROM [NCAAF].[dbo].[NCAAF_MASTER_GAME_ODDS] a
  LEFT JOIN (SELECT DISTINCT Game_Code, Attendance, Duration
  from [NCAAF].[dbo].[game-statistics2018]) b
  ON a.Game_Code = b.Game_Code
  WHERE a.Date BETWEEN '20180701' AND '20190301'
UNION
SELECT a.*, c.Attendance, c.Duration, NULL as Rush_Att, NULL as Rush_Yard
  FROM [NCAAF].[dbo].[NCAAF_MASTER_GAME_ODDS] a
  LEFT JOIN (SELECT DISTINCT Game_Code, Attendance, Duration
  from [NCAAF].[dbo].[game-statistics2019]) c
  ON a.Game_Code = c.Game_Code
  WHERE a.Date BETWEEN '20190701' AND '20200301'
UNION
SELECT a.*, d.Attendance, d.Duration, NULL as Rush_Att, NULL as Rush_Yard
  FROM [NCAAF].[dbo].[NCAAF_MASTER_GAME_ODDS] a
  LEFT JOIN (SELECT DISTINCT Game_Code, Attendance, Duration
  from [NCAAF].[dbo].[game-statistics2020]) d
  ON a.Game_Code = d.Game_Code
  WHERE a.Date BETWEEN '20200701' AND '20210301'
UNION
SELECT a.*, NULL as Attendance, NULL as Duration, e.Rush_Att, e.Rush_Yard
  FROM [NCAAF].[dbo].[NCAAF_MASTER_GAME_ODDS] a
  LEFT JOIN (SELECT DISTINCT Team_Code, Game_Code, Rush_Att, Rush_Yard
  from [NCAAF].[dbo].[team-game-statistics2018]) e
  ON a.Game_Code = e.Game_Code AND a.[Team Code] = e.Team_Code
  WHERE a.Date BETWEEN '20180701' AND '20190301'