我正在编写一个查询来检索两个表中的数据。表格的数据如下:
表1:
StudentId Studentname
---------------------
1 test
2 test1
表2:
StudentId Assignmentstatus date
--------------------------------------
1 0 01/01/2014
1 1 02/01/2014
状态1表示已提交作业,2表示经过验证后返回。
加入表格
select
student.StudentId, student.Studentname,
case (select top 1 Assignmentstatus
from Assignment
where Assignment.StudentId = student.StudentId
order by date desc) when 0 then 1 else 0 end as AssignmentSubmitted
from
student
left join
Assignment on Assignment.studentId = Student.StudentId.
它也为StudentId 2返回1。
答案 0 :(得分:2)
首先,这是您的查询:
select s.StudentId, s.Studentname,
(case (select top 1 Assignmentstatus
from Assignment a2
where a2.StudentId = s.StudentId
order by date desc
)
when 0 then 1 else 0
end) as AssignmentSubmitted
from student s left join
Assignment a
on a.studentId = s.StudentId;
分配的外部联接不是必需的,因此您可能真的需要:
select s.StudentId, s.Studentname,
(case (select top 1 Assignmentstatus
from Assignment a2
where a2.StudentId = s.StudentId
order by date desc
)
when 0 then 1 else 0
end) as AssignmentSubmitted
from student s;
您的内部联接正在将给定学生AssignmentStatus
中Assignment
的最新值与0
进行比较。因为两个学生都不是最近的状态0.在一个案例中,它是" 1"。在另一个" Null"中,它总是返回0.一个SQL小提琴是here。
据推测,您希望状态(如果可用)。我倾向于使用outer apply
编写此查询:
select s.StudentId, s.Studentname, coalesce(a.Assignmentstatus, 0) as Assignmentsubmitted
from student s outer apply
(select top 1 Assignmentstatus
from Assignment a2
where a2.StudentId = s.StudentId
order by date desc
) a;
如果实际逻辑更复杂,您可以使用case
代替coalesce()
。
答案 1 :(得分:1)
您不需要使用CASE声明。相反,您可以使用ISNULL
替换NULL
0
:
SELECT Student.StudentId,
Student.Studentname,
ISNULL(Assignment.AssignmentStatus, 0) AS AssignmentStatus
FROM Student
LEFT JOIN Assignment
ON Assignment.StudentId = Student.StudentId
答案 2 :(得分:0)
您似乎想要向任何学生提供最新的Assignmentstatus,不是吗?
那是怎么回事?
select t1.Studentname,
t2.Assignmentstatus,
t2.date
from table1 t1, table2 t2
where t1.StudentId = t2.StudentId
and t2.date = (Select max(date) from table2 where StudentId = t1.StudentId)
答案 3 :(得分:0)
假设AssignmentStatus只会增加(例如,在返回后不会再回到'提交'),那么你可以使用类似的东西:
SELECT s.StudentId
, s.Studentname
, ISNULL(MAX(a.AssignmentStatus), 0) AS AssignmentStatus
FROM Student s
LEFT JOIN Assignment a ON a.StudentId = s.StudentId
group by s.StudentId, s.Studentname