3

我在 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 进行左/右外连接,但无法获得所需的结果。如何实现?

4

2 回答 2

2

SQL小提琴

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

结果

| 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

于 2013-02-05T06:40:58.143 回答
0
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
于 2013-02-05T06:21:19.473 回答