sql server 2008中具有外部/左侧联接的分组依据
我在表1中有如下数据:sql server 2008中具有外部/左侧联接的分组依据,sql,sql-server-2008,join,group-by,Sql,Sql Server 2008,Join,Group By,我在表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),如下所示:
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),如下所示:
这意味着没有用户参加过测试(TestID=7)show now我想如下所示显示数据
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的左/右外部联接,但未能获得预期的结果。如何实现它?
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
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)
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) |
查询1:
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)
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) |
:
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)
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
将
用户改为U
。其sql server 2008 R2i以前曾尝试过此方法,但未显示正确的结果,本例中的输出为-UserID CourseID TestID Result 1 1 1 P 1 2 P 2 1 1 F 2 1 2 F null 1 7 null类似于上述内容我看到了问题,需要与用户表r“选择不同的UserID”派生表连接。虽然即将上床睡觉,但是.似乎工作正常,只是最后一行的一点-R.UserID=C.TestID不应该是R.UserID=U.UserID?@user1509581应该是U.UserID