0

我正在尝试查询 CRM 用户的数据库,该表称为crm_main。为了便于解释,我们假设此表中有 3 个用户。我有另一个名为crm_comments的表,它为每个用户存储多个带有时间戳的评论。

有没有办法选择 crm_main 中的所有用户,并且如果 crm_comments 表中存在评论,则将最近的用户(基于时间戳)附加到该行?我尝试过使用 CROSS APPLY 方法:

SELECT  *
FROM crm_main d
CROSS APPLY
        (
        SELECT TOP 1 timestamp, customerid
        FROM crm_comments m
        WHERE m.customerid = d.id
        ORDER BY
                m.timestamp DESC
        ) m

这样做的问题是,如果 crm_comments 表中存在针对用户的评论,它只会从 crm_main 表返回用户。因此,如果用户 id 1 和 3 在 crm_comments 表中有与之关联的评论,它们会显示,但没有评论的用户(用户 id 2)不会显示。有没有办法查询它们并且只为时间戳显示NULL?

这样所有 3 都会显示,但 id#1 和 id#3 将有时间戳,而 id#2 将只有 NULL。

也许有一种方法可以用 CASE 做到这一点?

4

1 回答 1

2

听起来您想使用OUTER APPLY而不是 CROSS APPLY:

SELECT  *
FROM crm_main d
OUTER APPLY
        (
        SELECT TOP 1 timestamp, customerid
        FROM crm_comments m
        WHERE m.customerid = d.id
        ORDER BY
                m.timestamp DESC
        ) m;

请参阅带有演示的 SQL Fiddle

来自 MSDN:

OUTER APPLY 返回生成结果集的行和不生成结果集的行,在表值函数生成的列中具有 NULL 值。

于 2013-08-08T23:32:17.740 回答