【问题标题】:SQL - inner join (where,and,not)SQL - 内连接 (where,and,not)
【发布时间】:2020-03-17 07:01:31
【问题描述】:

我有 2 张桌子:

1) STUDENTS-> primery key- id (int)
                     - firstName
                     - lastName
                     - city
2) GRADES->   primery key- studentID (int)
              primery key- courseID ('e' or 'h' or 'm')
                     - grade

我正在尝试选择参加“m”课程但未参加“h”或“e”课程的学生姓名。

我的解决办法是:

SELECT  * FROM STUDENTS S
INNER JOIN GRADES G1 ON S.ID=G1.STUDENTID
INNER JOIN GRADES G2 ON G1.COURSEID !=G2.COURSEID AND G1.STUDENTID = G1.STUDENTID
WHERE (G1.COURSEID = 'Math ' AND NOT  (G2.COURSEID = 'Eng  ' OR G2.COURSEID = 'Heb'))

知道有什么问题吗?

【问题讨论】:

  • 你应该在 GRADES 表中设置 StudentID,作为外键

标签: sql oracle inner-join


【解决方案1】:
SELECT * 
FROM STUDENTS S 
INNER JOIN GRADES G ON S.ID=G.STUDENTID and G.COURSEID = 'Math '
where s.id not in (
  select STUDENTID from GRADES where COURSEID = 'Eng ' OR G2.COURSEID = 'Heb'
)

【讨论】:

    【解决方案2】:

    另一种使用左连接的方法

    SELECT G1.STUDENTID, G1.firstName, G1.COURSEID!
    FROM GRADES G1
    LEFT JOIN STUDENTS S ON S.ID=G1.STUDENTID
    GROUP BY G1.STUDENTID
    HAVING G1.COURSEID='Math' AND G1.COURSEID!='Heb' AND G1.COURSEID!='Eng'
    

    另外,您应该将 GRADES 表中的 StudentId 保留为外键

    【讨论】:

      【解决方案3】:

      SELECT a.firstName, a.lastName, b.courseID
      FROM STUDENTS a
      INNER JOIN GRADES b
      ON a.id = b.studentID
      AND b.courseID = 'Math'
      WHERE a.id NOT IN (
      SELECT studentID FROM GRADES b 
      WHERE courseID = 'Eng'
      OR b.courseID = 'heb')

      使用这个

      【讨论】:

        【解决方案4】:

        有多种方法。

        您可以使用NOT EXISTSGROUP BY ... HAVING,如下所示:

        -- 1
        
        SELECT * FROM STUDENTS S
        INNER JOIN GRADES G1 ON S.ID = G1.STUDENTID
        WHERE G1.COURSEID = 'Math'
            AND NOT EXISTS (
                SELECT 1 FROM GRADES G2
                WHERE G2.STUDENTID = G1.STUDENTID
                  AND G2.COURSEID IN ('Eng','Heb')
            );
        
        -- 2 
        
        SELECT S.ID, S.FIRSTNAME, S.LASTNAME FROM STUDENTS S
               INNER JOIN GRADES G1 ON S.ID = G1.STUDENTID
               WHERE COURSEID IN ('Math','Eng','Heb')
        GROUP BY S.ID, S.FIRSTNAME, S.LASTNAME
        HAVING SUM(CASE WHEN COURSEID IN ('Eng','Heb') THEN 1 END) = 0
           AND SUM(CASE WHEN COURSEID = 'Math' THEN 1 END) <> 0
        

        干杯!!

        【讨论】:

          【解决方案5】:

          你可以做聚合:

          select s.id
          from student s inner join
               grades g
               on g.studentid = s.studentid
          group by s.id
          having sum(case when g.courseid in ('eng', 'hub') then 1 else 0 end) = 0 and
                 sum(case when g.courseid = 'Math' then 1 else 0 end) = 1;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-17
            • 2020-07-29
            相关资源
            最近更新 更多