Sql server 2008 右表中不匹配的SQL右外部联接
是否可以执行SQL查询,从左表中获取一些信息,从右表中获取与条件匹配的所有信息。 但是,如果没有与右表中的条件匹配的记录,则它仍应显示完整的记录,但填充了大量的*NULL*s 目前,我要说的是: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
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