Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 右表中不匹配的SQL右外部联接_Sql Server 2008 - Fatal编程技术网

Sql server 2008 右表中不匹配的SQL右外部联接

Sql server 2008 右表中不匹配的SQL右外部联接,sql-server-2008,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(va

是否可以执行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
但这仅显示
用户表
中的记录,前提是
关系表
中有与
WHERE
-条件匹配的记录

有可能吗?

是的

通过
左侧外部联接更改
右侧外部联接

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

左外部联接逻辑运算符返回满足以下条件的每一行 第一个(顶部)输入与第二个(底部)输入的连接。信息技术 还返回第一个输入中没有匹配行的所有行 在第二个输入中。第二个输入中不匹配的行是 作为空值返回。如果参数中不存在连接谓词 列中,每行都是一个匹配行

考虑到这一点,
join
是通过限制
u.id=r.userid
进行的。因此,如果
中不存在
限制,则结果将是所有
用户的
u.id、u.fullname、r.*

由于有一个
where
子句,一些行可能会被放在外面,如果您不想这样做,请使用以下查询:

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

注意外部表(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;

如果要从左(第一个)表创建表,则应使用左外部联接。我在实践中很少看到正确的外部联接,因为它们在逻辑上是不直观的。没错,但这仍然不能解决问题:(没有解决问题。它仍然只显示在右表中找到匹配记录的记录。检查我的修订答案并阅读所有记录。如果我遗漏了什么,请告诉我。但是你的问题应该在where限制中,或者你忘记在代码中左而不是右!如果你同时有
u
r
me在
WHERE
子句中提到,您还可以将
左侧外部
更改为
内部
@AaronBertrand。确实如此D@eriziasAaronBertrand在where子句中发现了一个限制,它搁置了一些结果。现在你明白为什么会发生这种情况了吗?
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