使用EXIST关键字查找值

时间:2011-12-11 16:11:41

标签: sql sql-server

我有下一张桌子:code, year, day

我希望找到周日周一在2000年拍摄的课程代码。

所以我写了下一个查询:

Select DISTINCT dbo.Course.Code
From dbo.Course
Where dbo.Course.CourseYear = 2000 AND 
EXISTS (Select * From dbo.course Where (dbo.course.day = 'Sunday' and dbo.Course.CourseYear = 2000))and 
EXISTS (Select * From dbo.course Where (dbo.course.day = 'Monday' and dbo.Course.CourseYear = 2000))

这是我在2000年周日周一给出的课程。为什么呢?

3 个答案:

答案 0 :(得分:2)

这是家庭作业吗?

查询无法按预期工作,因为您的查询仅要求2000年的任何课程是星期一或星期日 - 但它并不特定于您正在查看的行

SELECT c1.Code
FROM dbo.Course AS c1
WHERE c1.CourseYear = 2000 
AND c1.day = 'Sunday' 
AND EXISTS (
    SELECT * 
    FROM dbo.Course AS c2 
    WHERE (c1.Code = c2.Code) AND (c2.day = 'Monday'))

答案 1 :(得分:1)

您需要强制在两个exists语句中检查相同的课程记录。 您的存在声明仅确保在周日提供任何课程以及星期一提供的任何课程

修改您的查询:

Select DISTINCT dbo.Course.Code
From dbo.Course c
Where dbo.Course.CourseYear = 2000 AND 
EXISTS (Select * From dbo.course Where (dbo.course.day = 'Sunday' and dbo.Course.CourseYear = 2000 and dbo.course.Code = c.Code))and 
EXISTS (Select * From dbo.course Where (dbo.course.day = 'Monday' and dbo.Course.CourseYear = 2000 and dbo.course.Code = c.Code))

更好的书面版本

select distinct c.code
from
dbo.course c
inner join dbo.course c2 on c.code = c2.code
where
c.CourseYear = 2000
and c2.CourseYear = 2000
and c.Day = 'Monday'
and c2.Day = 'Sunday'

另请注意,您的架构未规范化。你应该有两个表:

  1. 课程(CourseId,代码)
  2. CourseInstance(CourseId,Day,Year)

答案 2 :(得分:1)

这实际上不是它给你的东西。你使用的方式存在,你要求服务器返回每条记录,如果表中存在满足“星期日”和2000的任何记录,并且如果存在满足“星期一”和2000的任何记录。那么单向查询并得到你想要问的是:

 select c.Code
   from dbo.Course c
  where c.CourseYear = 2000
  group by
        c.Code
 having sum(case when c.day = 'Sunday' then 1 else 0 end) > 0
    and sum(case when c.day = 'Monday' then 1 else 0 end) > 0