【问题标题】:SQL Server: query values and show null if no resultSQL Server:查询值并在没有结果时显示 null
【发布时间】:2018-07-02 14:37:30
【问题描述】:

我有 3 张桌子

  • KALENDER - 此表包含一年的日历以及我们不工作的日子
  • GEOPERS - 此表包含人员数据及其唯一用户名
  • 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 中所有值的列表,如果不是 NULL,它们是否带有标记,然后时间戳

请帮忙:-)

【问题讨论】:

  • 您将需要在 kalendar 和 geopers 之间进行完全外连接,而不是左连接。
  • ISNULL 函数是多余的,因为无论如何你都分配了 NULL。

标签: sql sql-server outer-join


【解决方案1】:

我想,你应该申请full outer join

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) 语句,这是完全错误的用法。

【讨论】:

  • 那行不通,我有 10 名军人,所以这意味着我每个日期应该有 10 个徽章时间戳,如果没有时间戳,那么他的名字仍然应该为 NULL
  • 所以,完全连接可以满足这一点。 “那行不通”是什么意思
  • 这是我得到的结果,不管我是做全外连接、左外连接还是全连接 [link]imgur.com/a/pqbQA
  • 它应该显示所有其他值为 NULL 的技术人员,因为他们没有工作或使用他们的徽章,我希望这更清楚
【解决方案2】:

我认为cross join 是要走的路。这是我为证实我的观点所做的事情。您可以将其应用于您的数据库对象:

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

【讨论】:

    【解决方案3】:

    试试这个:

    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 
    

    【讨论】:

    • 无法绑定多部分标识符“k.datum”。
    • 您使用的是什么版本的 SQL Server?
    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多