【问题标题】:SQL Joint query for unmatched rows in left tableSQL Join查询左表中不匹配的行
【发布时间】:2015-06-16 05:22:13
【问题描述】:

我有两张桌子,sfuser 和会员

sfuser 得到 139,会员表得到 50

我需要查询来选择谁不是任何项目的成员,这意味着 89 个成员

这是我的查询

select sfuser.id,sfuser.username,sfuser.email from sfuser INNER JOIN projectmembership ON sfuser.id = projectmembership.member_id ;

但是我得到了我想要的 50 个会员用户

请给我一点光

最好的问候 萨蒂什

【问题讨论】:

    标签: mysql sql sql-server postgresql join


    【解决方案1】:
    select 
    sfuser.id,
    sfuser.username,
    sfuser.email 
    from sfuser 
    LEFT JOIN projectmembership ON sfuser.id = projectmembership.member_id
    WHERE 
    projectmembership.member_id is NULL
    

    它应该返回所有不在 projectmembership 表中的用户。

    【讨论】:

    • 非常感谢 darius 和 abhik
    【解决方案2】:

    INNER JOIN 只会生成匹配两个表的行。您可以进行左连接并过滤掉空白记录。类似:

    SELECT sfuser.id,
    sfuser.username,
    sfuser.email
    FROM sfuser LEFT JOIN projectmembership ON sfuser.id = projectmembership.member_id
    WHERE (projectmembership.member_id is null);
    

    【讨论】:

      【解决方案3】:

      内连接将返回所有行,其中完成连接的值在两个表之间共享。 (见this chart

      您要查找的是左连接,即左表中所有在右表中没有匹配的行。

      select sfuser.id,
        sfuser.username,
        sfuser.email 
      from sfuser 
      LEFT JOIN projectmembership 
        ON sfuser.id = projectmembership.member_id
      

      【讨论】:

        【解决方案4】:

        如果 sfuser 记录可以在项目成员表中多次出现,那么忘记外连接 -- NOT EXISTS 就是你想要的:

        select sid,
               username,
               email
        from   sfuser
        where  not exists (
                 select null
                 from   projectmembership
                 where  sfuser.id = projectmembership.member_id);
        

        【讨论】:

          猜你喜欢
          • 2019-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-23
          • 1970-01-01
          相关资源
          最近更新 更多