SQL Server:查询值,如果没有结果,则显示null
我有三张桌子SQL Server:查询值,如果没有结果,则显示null,sql,sql-server,outer-join,Sql,Sql Server,Outer Join,我有三张桌子 KALENDER-此表包含一年的日历以及我们不工作的日期 地质勘探人员-此表包含人员数据及其唯一用户名 GEOTIKKINGEN-此表包含时间戳(某人使用徽章进入房间的日期和时间) 我正在尝试获取一个查询以返回如下值: ------------------------------------------------------------ | Date | Username | Badge timestamp | ---------
- KALENDER-此表包含一年的日历以及我们不工作的日期
- 地质勘探人员-此表包含人员数据及其唯一用户名
- GEOTIKKINGEN-此表包含时间戳(某人使用徽章进入房间的日期和时间)
------------------------------------------------------------
| Date | Username | Badge timestamp |
------------------------------------------------------------
| 01-jan-2018 | Steve | null |
| 01-jan-2018 | Peter | 01-01-2018T08:25:21 |
| 01-jan-2018 | Sasha | null |
| 02-jan-2018 | Steve | null |
| 02-jan-2018 | Peter | null |
| 02-jan-2018 | Sasha | null |
| 03-jan-2018 | Steve | 03-01-2018T12:01:20 |
| 03-jan-2018 | Peter | 03-01-2018T06:39:01 |
| 03-jan-2018 | Sasha | 03-01-2018T09:11:15 |
------------------------------------------------------------
查询应该转到并显示表Kalender
中每个值以及表GeoPers
中每个人的结果,然后显示他们的徽章时间戳,如果不是,则为NULL
到目前为止,我已经做到:
select
k.datum, isnull(gp.name,null), isnull(gt.DateTimeLocal,null)
from
Kalender k
left outer join
GeoTikkingen gt on CAST(k.datum as DATE) = CAST(gt.DateTimeLocal as DATE)
left outer join
GeoPers gp on gp.name = gt.UserName
order by
k.datum asc, gp.name asc
但是,当用户在某一天没有标记时,它不会返回NULL
我应该能够有一个列表,列出Kalender中的所有值和GeoPers中的所有值,如果不为空,是否标记了时间戳
请帮助:-)我想,你应该申请
完全外部连接
select k.datum, gp.name, gt.DateTimeLocal
from Kalender k
full outer join GeoTikkingen gt on CAST(k.datum as DATE) = CAST(gt.DateTimeLocal as DATE)
full outer join GeoPers gp on gp.name = gt.UserName
order by k.datum asc, gp.name asc
并删除
isnull(gt.DateTimeLocal,null)
语句,它的用法完全错误 我认为交叉连接
是一条出路。我做了一些事情来证实我的观点。您可以将其应用于数据库对象:
with a as (select 1 record
union select 2 record)
, b as (select 'a' text
union select 'b' text)
,c as (select 1 r
union select 4 r)
select record, text, r
from a cross join b
left join c on record = r
试试这个:
SELECT k.datum,
gp.name,
gt.DateTimeLocal
FROM Kalender k,
GeoPers gp
LEFT OUTER JOIN GeoTikkingen gt
ON Cast(k.datum AS DATE) = Cast(gt.DateTimeLocal AS DATE)
AND gp.name = gt.UserName
ORDER BY k.datum ASC,
gp.name ASC
kalendar和geopers之间需要一个完整的外部连接,而不是左连接。ISNULL函数是多余的,因为您无论如何都要分配NULL。这不起作用,我有10名军人,这意味着我应该有每个日期10个徽章时间戳,如果没有时间戳,那么他的名字上仍然应该是NULL,完全联接将满足这一要求。“那不起作用”是什么意思?这是我得到的结果,不管我是做完全外部连接、左外部连接还是完全连接[link],它应该显示所有其他技术人员,值为空,因为他们没有工作或使用他们的徽章,我希望这能使多部分标识符“k.datum”更清晰无法绑定。您使用的是哪个版本的SQL Server?