SQL 服务器:Select 来自一个 table 的记录列表对于另一个 table 中的每条记录?
SQL Server: Select a list of records from a table for each record in another table?
我目前有 table 个用户和一个 Picks(用于足球池)。当获得结果时,我 运行 查询 select 用户,然后在我的代码中我遍历该列表 select 为每个用户从另一个 table 中选择多个选项。
Picks table 每个选择都在不同的行上,因此:GameID、UserID、Pick。实际上有一个与另一个 table 的连接与 GameID:Week 关系,但我可以将其更改为 IN 查询,现在我并不担心。
这有点慢而且笨拙,所以我想知道是否可以通过一次查询整个数据集来加快速度。我很确定我以前在某个地方做过这个但是很久以前我找不到我使用的代码。
伪编码类似于:SELECT UserID,(SELECT Multiple GameID,Pick FROM Picks WHERE UserID = @UserID)。 IE 我希望子查询的多行作为主查询中的列返回。只有为子查询 selected 的单个值真的才有可能吗?
你不就是在找一个join
吗?
select u.*, p.gameid, p.pick
from users u
left join picks p on p.userid = u.user_id
由于 OP 声明“我希望子查询的多行作为主查询中的列返回”,我认为他们正在寻找用户的交叉表或数据透视结果。像这样
select u.userid, u.username,
max(case when gw.game_wk=1 then p.pick else null end) wk1_picks,
max(case when gw.game_wk=2 then p.pick else null end) wk2_picks,
max(case when gw.game_wk=3 then p.pick else null end) wk3_picks,
max(case when gw.game_wk=4 then p.pick else null end) wk4_picks,
max(case when gw.game_wk=5 then p.pick else null end) wk5_picks,
max(case when gw.game_wk=6 then p.pick else null end) wk6_picks,
max(case when gw.game_wk=7 then p.pick else null end) wk7_picks,
max(case when gw.game_wk=8 then p.pick else null end) wk8_picks,
max(case when gw.game_wk=9 then p.pick else null end) wk9_picks,
max(case when gw.game_wk=10 then p.pick else null end) wk10_picks
from users u
left join picks p on p.userid = u.userid
left join game_weeks gw on p.gameid=gw.gameid
group by u.userid, u.username;
我目前有 table 个用户和一个 Picks(用于足球池)。当获得结果时,我 运行 查询 select 用户,然后在我的代码中我遍历该列表 select 为每个用户从另一个 table 中选择多个选项。
Picks table 每个选择都在不同的行上,因此:GameID、UserID、Pick。实际上有一个与另一个 table 的连接与 GameID:Week 关系,但我可以将其更改为 IN 查询,现在我并不担心。
这有点慢而且笨拙,所以我想知道是否可以通过一次查询整个数据集来加快速度。我很确定我以前在某个地方做过这个但是很久以前我找不到我使用的代码。
伪编码类似于:SELECT UserID,(SELECT Multiple GameID,Pick FROM Picks WHERE UserID = @UserID)。 IE 我希望子查询的多行作为主查询中的列返回。只有为子查询 selected 的单个值真的才有可能吗?
你不就是在找一个join
吗?
select u.*, p.gameid, p.pick
from users u
left join picks p on p.userid = u.user_id
由于 OP 声明“我希望子查询的多行作为主查询中的列返回”,我认为他们正在寻找用户的交叉表或数据透视结果。像这样
select u.userid, u.username,
max(case when gw.game_wk=1 then p.pick else null end) wk1_picks,
max(case when gw.game_wk=2 then p.pick else null end) wk2_picks,
max(case when gw.game_wk=3 then p.pick else null end) wk3_picks,
max(case when gw.game_wk=4 then p.pick else null end) wk4_picks,
max(case when gw.game_wk=5 then p.pick else null end) wk5_picks,
max(case when gw.game_wk=6 then p.pick else null end) wk6_picks,
max(case when gw.game_wk=7 then p.pick else null end) wk7_picks,
max(case when gw.game_wk=8 then p.pick else null end) wk8_picks,
max(case when gw.game_wk=9 then p.pick else null end) wk9_picks,
max(case when gw.game_wk=10 then p.pick else null end) wk10_picks
from users u
left join picks p on p.userid = u.userid
left join game_weeks gw on p.gameid=gw.gameid
group by u.userid, u.username;