【问题标题】:group by with outer/left join in sql server 2008在 sql server 2008 中使用外部/左连接进行分组
【发布时间】:2013-02-05 06:15:24
【问题描述】:

我在 1 个表中有数据

UserID CourseID TestID   Result
1         1       1        P
1         1       2        P
2         1       1        F
2         1       2        F

这表明 2 个用户(UserID =1 和 2)在 CourseID =1 中参加了测试(TestID=1 和 2)

现在 CourseID 总共有 3 个测试(比如 TestID=1,2,7)

CourseID TestID
1          1
1          2
1          7

这意味着没有用户参加过测试 (TestID=7) 现在我想显示如下数据

UserID CourseID TestID   Result
1         1       1        P
1         1       2        P
1         1       7        null
2         1       1        F
2         1       2        F
2         1       7        null

我一直在尝试使用 Group by 进行左/右外连接,但无法获得所需的结果。如何实现?

【问题讨论】:

  • 它的 sql server 2008 R2

标签: sql sql-server-2008 join group-by


【解决方案1】:

SQL Fiddle

MS SQL Server 2008 架构设置

create table Result
(
  UserID int,
  CourseID int,
  TestID int,
  Result char(1)
)
insert into Result values
(1,         1,       1,        'P'),
(1,         1,       2,        'P'),
(2,         1,       1,        'F'),
(2,         1,       2,        'F')

create table Course
(
  CourseID int,
  TestID int
)

insert into Course values
(1, 1),
(1, 2),
(1, 7)

查询 1

select U.UserID,
       C.CourseID,
       C.TestID,
       R.Result
from (
     select distinct UserID
     from Result
     ) as U
  cross apply Course as  C
  left outer join Result as R
    on R.CourseID = C.CourseID and
       R.TestID = C.TestID and
       R.UserID = U.UserID

Results

| USERID | COURSEID | TESTID | RESULT |
---------------------------------------
|      1 |        1 |      1 |      P |
|      1 |        1 |      2 |      P |
|      1 |        1 |      7 | (null) |
|      2 |        1 |      1 |      F |
|      2 |        1 |      2 |      F |
|      2 |        1 |      7 | (null) |

注意:如果你有一个表Users,你可以替换派生表

 (
 select distinct UserID
 from Result
 ) as U

改为Users as U

【讨论】:

  • 似乎按预期工作,只是关于最后一行的一点 - R.UserID = C.TestID 不应该是 R.UserID = U.UserID ?
  • @user1509581 应该是U.UserID
【解决方案2】:
SELECT uct.UserId, ct.CourseID, ct.TestID, uct.Result
FROM CourseTest ct
LEFT JOIN UserCourseTest uct ON uct.CourseID=ct.CourseID AND uct.TestID=ct.TestID

【讨论】:

  • 我以前试过这个,但它没有显示正确的结果,在这种情况下输出是 - UserID CourseID TestID Result 1 1 1 P 1 1 2 P 2 1 1 F 2 1 2 F null 1 7 null 类似于上面
  • 我看到了问题,需要加入用户表 r “选择不同的用户 ID”派生表。不过要睡觉了。
猜你喜欢
  • 2021-11-25
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 2021-02-03
  • 2017-03-18
相关资源
最近更新 更多