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?