代码之家  ›  专栏  ›  技术社区  ›  Alan M.

从另一个表中没有记录的表中提取记录

  •  2
  • Alan M.  · 技术社区  · 16 年前

    SURVEYS 表:

    SurveyID
    UserID
    Question
    Choice1
    Choice2
    Choice3
    

    RESPONSES 表:

    UserID
    SurveyID
    Answer
    

    第一个愿望(实现):向我展示用户28发起的所有调查:

    SELECT * 
      FROM Surveys 
     WHERE Surveys.UserID = 28
    

    第二个愿望(实现):向我展示用户28已回答的所有调查:

    SELECT * 
      FROM Surveys 
    INNER JOIN Responses ON Surveys.SurveyID = Responses.SurveyID 
     WHERE Responses.UserID = 28
    

    第三个愿望(未实现):

    显示用户28未启动的所有调查,以及用户28尚未回答的所有调查…从调查中选择*在surveys.surveyid=responses.surveyid where surveys.userid<gt;28和responses.userid<gt;28[或者:where not surveys.userid=28或responses.userid=28]

    第三个查询将删除用户28的记录,但将显示同一调查的其他实例。例如,假设用户29回答了调查。将返回一行,因为where不禁止用户29的记录。

    我想到使用子查询——类似于:select*from surveys.userid<gt;28 and surveys.surveyid<gt;(select responses.surveyid where responses.userid=28)——但这不起作用,因为子查询可以轻松生成多行。

    解决办法是什么?

    2 回复  |  直到 16 年前
        1
  •  6
  •   OMG Ponies    16 年前

    使用不在:

    SELECT s.*
      FROM SURVEYS s
     WHERE s.userid != 28
       AND s.surveyid NOT IN (SELECT r.survey_id
                                FROM RESPONSES r
                               WHERE r.userid = 28)
    

    使用左联接/为空:

       SELECT s.*
         FROM SURVEYS s
    LEFT JOIN RESPONSES r ON r.survey_id = s.surveyid
                         AND r.user_id = 28
        WHERE s.userid != 28
          AND r.userid IS NULL
    

    使用不存在:

    SELECT s.*
      FROM SURVEYS s
     WHERE s.userid != 28
       AND NOT EXISTS (SELECT NULL
                         FROM RESPONSES r
                        WHERE r.userid = 28
                          AND r.survey_id = s.surveyid)
    

    在列出的选项中, NOT IN LEFT JOIN/IS NULL 虽然我更喜欢 不在 因为它更可读。

        2
  •  0
  •   danielrsmith    16 年前

    我想应该这样做?

    SELECT * 
    FROM Surveys s
    WHERE s.UserID != 28 
    AND s.SurveyID NOT IN (SELECT R.SurveyID FROM Responses R WHERE R.UserID = 28)