【问题标题】:SQL Server: Select a list of records from a table for each record in another table?SQL Server:从一个表中为另一个表中的每条记录选择一个记录列表?
【发布时间】:2021-01-26 18:44:27
【问题描述】:

我目前有一个用户表和一个 Picks(用于足球池)。当得到结果时,我运行一个查询来选择用户,然后在我的代码中我遍历该列表,从另一个表中为每个用户选择多个选择。

Picks 表在不同的行中包含每个选择,因此:GameID、UserID、Pick。实际上存在与另一个具有 GameID:Week 关系的表的连接,但我可以将其更改为 IN 查询,现在并不担心。

这有点慢和笨重,所以我想知道是否可以通过一次查询整个数据集来加快速度。我很确定我在很久以前的某个地方做过这个,但我找不到我使用的代码。

伪编码类似于:SELECT UserID, (SELECT Multiple GameID, Pick FROM Picks WHERE UserID = @UserID)。 IE 我希望将子查询的多行作为主查询中的列返回。只有为子查询选择一个值,这是否真的可行?

【问题讨论】:

  • 您的示例查询中的第一个 UserID 将在此处出错;您的查询中没有FROM,因此UserID 没有上下文。但是,子查询也将失败,因为它返回 2 列,并且在 SELECT 中引用的子查询只能返回 scalar 值。我的假设是你在JOIN之后。

标签: sql sql-server subquery left-join inner-join


【解决方案1】:

由于 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;

【讨论】:

  • 这就是我要找的。我提供了表格的简化版本,但能够根据我的需要进行调整。谢谢!
【解决方案2】:

您不只是在寻找join吗?

select u.*, p.gameid, p.pick 
from users u
left join picks p on p.userid = u.user_id

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    相关资源
    最近更新 更多