无论如何可以进行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
的记录。
无论如何可能?
答案 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