ON 子句具有子查询的两个表上的右外连接

Posted

技术标签:

【中文标题】ON 子句具有子查询的两个表上的右外连接【英文标题】:Right outer join on two tables where ON clause has a subquery 【发布时间】:2012-09-05 17:53:31 【问题描述】:

我正在尝试对两个 liferay 表(users_expandovalue)执行右外连接以获取结果集。

当我对所有用户进行以下查询时,我得到了想要的结果。

SELECT USER_.FIRSTNAME
     , USER_.LASTNAME
     , USER_.EMAILADDRESS
     , USER_.JOBTITLE
     , expandovalue.data_  
from expandovalue 
     right outer join 
     user_ on expandovalue.classpk = user_.userid 
     and expandovalue.columnid =35695;

当尝试对一组用户(用户组的一部分)执行相同操作时,它会出错。如下查询:

SELECT USER_.FIRSTNAME
     , USER_.LASTNAME
     , USER_.EMAILADDRESS
     , USER_.JOBTITLE
     , expandovalue.data_ 
from expandovalue 
     right outer join
       user_ on expandovalue.classpk 
     in (select userid 
          from user_ 
         where userid 
                in ( select userid 
                      from users_usergroups
                     where usergroupid = 40073
                   ) and status =0) =   user_.userid in
                                             (select userid 
                                                from user_ 
                                               where userid 
                                                  in ( select userid 
                                                       from users_usergroups 
                                                     where usergroupid = 40073
                                                     )
                                              and status =0
                                            ) and expandovalue.columnid =35695

这是一个子查询,它给出了特定用户组中人员的userids。

(select userid 
   from user_ 
  where userid in 
                 ( select userid 
                     from users_usergroups
                    where usergroupid = 40073) 
                      and status =0
                 ) 

我是不是走错了方向?请指教。

【问题讨论】:

1.您的查询缺少“AND”:...and status =0) = Smile AND user_.userid in... 2. 您使用的是哪个数据库? 在后端使用 Oracle 10g。究竟是一个和失踪。谢谢莱特 发布的一个好主意是包含错误消息。下次注意。欢迎来到堆栈溢出 【参考方案1】:

试试这个查询:

SELECT USER_.FIRSTNAME,
       USER_.LASTNAME,
       USER_.EMAILADDRESS,
       USER_.JOBTITLE,
       expandovalue.data_
  from expandovalue
  right outer join user_
    on expandovalue.classpk IN
          (select userid
             from user_
             where userid in (select userid
                                from users_usergroups
                                where usergroupid = 40073) and 
                   status = 0) AND
       user_.userid in (select userid
                          from user_
                          where userid in (select userid
                                             from users_usergroups
                                             where usergroupid = 40073) AND
                                status =0) AND
       expandovalue.columnid = 35695

第一个子查询结束后缺少一个“AND”。

【讨论】:

您应该从上面删除“= Smile”。 OP 在编辑中从原始问题中删除了此文本(单击问题的编辑时间以查看编辑历史记录),但显然您在编辑问题时已经在查看问题。删除“= Smile”后,我怀疑它会起作用。谢谢。

以上是关于ON 子句具有子查询的两个表上的右外连接的主要内容,如果未能解决你的问题,请参考以下文章

左外连接和右外连接的区别

将具有右外连接的访问​​查询转换为 sqlite 查询

Mysql基础04-查询

SQL的四种连接-左外连接右外连接内连接全连接

SQL的四种连接-左外连接右外连接内连接全连接

SQL的四种连接-左外连接右外连接内连接全连接