SQL右外连接,右表中没有匹配项

时间:2012-05-02 16:26:40

标签: sql-server-2008

无论如何可以进行SQL查询,您可以从左表中获取一些信息,并从右表中获取与条件匹配的所有信息。 但如果没有与右表中的条件匹配的记录,它仍应显示完整记录,但填充了大量* NULL * s

目前,我已经来到这里:

select
 u.id, u.fullname,
 r.*
from
 users as u
right outer join
 rapports as r
on
 u.id = r.userid
where
 u.active = 1
 and (r.closed = 0 or CONVERT(varchar, r.periodstart, 112) = convert(varchar, GETDATE(), 112))
order by
 u.fullname

但是,如果user-table中的记录与rapports-table条件匹配,则仅显示WHERE的记录。

无论如何可能?

3 个答案:

答案 0 :(得分:2)

注意外部表(r)的条件去哪里 - 不在WHERE子句中(将外连接转换为内部连接),而是在ON子句中。

select
 u.id, u.fullname,
 r.*
from
 users as u
left outer join
 rapports as r
on
 u.id = r.userid
 and (r.closed = 0 
   or CONVERT(varchar, r.periodstart, 112) = convert(varchar, GETDATE(), 112))
where
 u.active = 1
order by
 u.fullname;

然而,这要好得多:

select
 u.id, u.fullname,
 r.*
from
 users as u
left outer join
 rapports as r
on
 u.id = r.userid
 and (r.closed = 0 or CONVERT(DATE, r.periodstart) = CONVERT(DATE, GETDATE()))
where
 u.active = 1
order by
 u.fullname;

答案 1 :(得分:1)

是<!/强>

right outer join改变left outer join

select
 u.id, u.fullname,
 r.*
from
 users as u
left outer join
 rapports as r
on
 u.id = r.userid
where
 u.active = 1
 and (r.closed = 0 or CONVERT(varchar, r.periodstart, 112) = convert(varchar, GETDATE(), 112))
order by
 u.fullname

  

Left Outer Join逻辑运算符返回满足的每一行   第一个(顶部)输入与第二个(底部)输入的连接。它   还返回第一个输入中没有匹配行的任何行   在第二个输入。第二个输入中的不匹配行是   返回为空值。如果参数中不存在连接谓词   列,每行都是匹配的行。

考虑到这一点,join是使用限制u.id = r.userid制作的。因此,如果where限制不存在,则结果将是所有u.id, u.fullname, r.*的{​​{1}}!

由于存在users子句,因此可能会将某些行放在一边,如果您不想这样做,请使用此查询:

where

答案 2 :(得分:-1)

SELECT  *
FROM    #temp_table_name

SELECT DISTINCT
        b.NAME ,
        q.valueI
FROM    #temp_table_name q
        RIGHT OUTER JOIN ( SELECT   NAME
                           FROM     ( SELECT    NAME ,
                                                valueI
                                      FROM      #temp_table_name
                                      INTERSECT
                                      SELECT    NAME ,
                                                valueI
                                      FROM      #temp_table_name
                                    ) a
                           GROUP BY a.name
                           HAVING   COUNT(*) = 1
                         ) b ON q.NAME = b.NAME