【问题标题】:Having Trouble Using "AND" Operator to Display Desired Results使用“AND”运算符显示所需结果时遇到问题
【发布时间】:2013-05-22 20:29:56
【问题描述】:

使用“AND”运算符获取查询以检索所需结果时遇到困难。需要在districtIDNum=5中显示完成了3门课程中任意一个的人的firstnamelastnameemailcourseID,即(Health Old (courseIDNum=11) OR 健康新 (courseIDNum=12)) AND (PE 旧 (courseIDNum=68 OR PE 新 (courseIDNum=177)) AND courseIDNum=128。请注意1112实际上是同一个课程:一个是旧课程,另一个是新课程(与68177相同),因此,人在 DistrictIDNum=5 中只能取其中一个;这就是我尝试使用 (11, 12) 的原因。但是,它无法正常工作,因为它返回 0 行。

SELECT max(p.FirstName),
       max(p.LastName),
       max(p.Email),
       max(s.CourseIDNum)
FROM People p
INNER JOIN Registration r
   on p.PeopleID = r.PeopleIdNum
INNER JOIN Section s
   on r.SectionIDNum = s.SectionID
INNER JOIN School sc
   on p.SchoolIDNum = sc.SchoolID
WHERE s.CourseIDNum IN (11, 12)
  AND s.CourseIDNum IN (68, 177)
  AND s.CourseIDNum=128
  AND sc.DistrictIDNum = 5
  AND r.Completed='Y'
group by p.PeopleID
having count(distinct s.CourseIDNum)=1

应该返回的行是Liz M,来自完成courseIDNum=195districtIDNum=12。手上,Esther B 来自districtIDNum=5 已完成courseIDs 11, 177 and 128;因此,她的数据应该显示所有 3 个 courseID。数据还应显示Tommy L 已完成courseIDs 12 and 68

以下是示例表:

peopleID   名字   姓氏   电子邮件                     schoolIDNum
1              以斯帖         B                b@hotmail.com      33
2               汤米        L                l@hotmail.com       55
3               Liz               M                m@hotmail.com     90

registrationID   peopleIDNum   sectionIDNum
22                    1                     40
23                    2                     41
24                    3                    132
25                    1                     78
26                    2                     52
27                    1                     63

sectionID   courseIDNum
40              11
41              12
52              68
63              128
78              177
132            195

课程ID   课程名称
11             健康(旧)
12             健康(新)
68             PE(旧)
128           键盘输入
177           PE(新)
195           计算

schoolID   districtIDNum
33             5
55             5
90             12

【问题讨论】:

    标签: sql sql-server-2008 tsql


    【解决方案1】:

    你陈述查询条件的方式

     s.CourseIDNum IN (11, 12)
     AND s.CourseIDNum IN (68, 177)
     AND s.CourseIDNum=128
    

    表示 CourseIDNum 必须同时等于一组整数

    SELECT p.FirstName,
           p.LastName,
           p.Email
    FROM People p
    WHERE p.PeopleID IN
    (
        SELECT r.PeopleIdNum
        FROM Registration r
        INNER JOIN Section s
           on r.SectionIDNum = s.SectionID
        INNER JOIN School sc
           on p.SchoolIDNum = sc.SchoolID
        WHERE s.CourseIDNum IN (11, 12, 68, 177, 128)
          AND sc.DistrictIDNum = 5
          AND r.Completed='Y'
    )
    

    获得人员列表后,通过连接部分记录来检索他们的 CourseID,如图所示 herehere

    【讨论】:

    • 我试过你的脚本,返回的行似乎是正确的,但是,我对连接不太了解,所以我可能需要一段时间才能得到我需要的结果。我会让你知道结果如何。感谢您的帮助。
    • 不要以为我完全掌握了从您发送给我的链接中连接的部分记录。我很抱歉,因为我对编程真的很陌生,而且都是自学的。你能给我更简单的例子吗?谢谢。
    【解决方案2】:
    WHERE s.CourseIDNum IN (11, 12)
      AND s.CourseIDNum IN (68, 177)
      AND s.CourseIDNum=128
    

    您的这部分意味着您正在编写类似这样的查询

    WHERE s.CourseIDNum IN (11,12,68,177) and courseIDNum = 128
    

    这意味着 CourseID num 在一种情况下可以等于 11 , 12, 68, 177 ,同时它应该等于 128 .... 这是不可能的。 所以我不确定,但尝试使用like

    WHERE (s.CourseIDNum IN (11, 12,68,177)
      OR s.CourseIDNum=128)
    

    【讨论】:

    • 感谢您的帮助。我使用了WHERE (s.CourseIDNum IN (11,12,68,177,128) OR s.CourseIDNum=128),它返回 1 行,但应该返回更多行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多