TSQL 交叉应用未按预期工作

TSQL Cross Apply not working as expected

有 3 个表:

用户:

       UID, DeptID, Name, Surname,  Admin
        U1  DeptA   John    Doe     0
        U2  DeptB   Jack    Fisher  0
        U3  DeptA   Jill    Smith   0
        U4  DeptA   Joan    Green   1
        U5  DeptC   Jeff    Jones   1
        U6  DeptA   Amanda  Reed    0
        ......

部门:

       DeptID, DeptName
        DeptA   Denver
        DeptB   Boston
        DeptC   Seattle

消息:

        Sender, Receiver, Message, CreatedDate, Seen
            U1      U3      Msg1        20152310    0
            U1      U4      Msg2        20152310    0
            U4      U1      Msg3        20152310    0
            U3      U4      Msg4        20152310    0
            U1      U3      Msg5        20152310    0
            U3      U1      Msg6        20152310    0

(用户只能向同一部门的其他用户发送消息)

只有一个参数作为输入,因此 UID

我需要创建一个列表,其中包含与 headers 相同部门的所有用户(输入 UID 除外),因此在示例中

U3          U4       U6

使用他们的详细信息(名字、姓氏)创建标签列表

然后对于上面的每个 UID,一个包含最新 20 条消息的列表,其中 U1 既作为发送者又作为接收者

要填写聊天边栏,您可以在此处查看:http://www.keenthemes.com/preview/metronic/theme/admin_4/

点击右上角的图标

我试过这个..但是有很多不知道如何删除的重复项:也许交叉应用不是正确的命令...:-(

SELECT  u.UID, 
        u.PWD,
        i.Sender,
        I.MessageText
        .....
FROM (
        SELECT  S.UID,
                S.PWD
            FROM dbo.Users  u
            JOIN dbo.Users  u2  ON  u.DeptID=u2.DeptID
            WHERE u2.UID=@_UID
            ORDER BY u.Admin DESC
        ) AS u
CROSS APPLY 
        (
            SELECT TOP (20) 
                    m.Sender, 
                    m.Message, 
                    m.CreatedDate, 
                    m.Seen
            FROM    dbo.Messages m
            WHERE   m.Sender=@_UID 
            OR      m.Receiver=@_UID
            ORDER BY m.CreatedDate DESC
        ) m;

能否指出问题所在?

谢谢

老实说,我无法弄清楚您的查询到底想做什么。但是从查看您链接的页面和您的问题描述来看,听起来您想要一个查询来填充用户列表(当前用户除外),另一个查询来获取与该用户相关的消息。

考虑如下:

DECLARE @_UID varchar(2) = 'U3';

-- Query for populating list of users
SELECT [UID], [Name] + ' ' + [Surname] AS [FullName]
FROM [dbo].[Users]
WHERE [UID] <> @_UID
ORDER BY [Admin] DESC, [Surname], [Name];

-- Query for populating messages
SELECT TOP 20 S.[UID] AS [SenderUID], S.[Name] + ' ' + S.[Surname] AS [SenderFullName],
    R.[UID] AS [ReceiverUID], R.[Name] + ' ' + R.[Surname] AS [ReceiverFullName],
    M.[Message], M.[CreatedDate], M.[Seen]
FROM [dbo].[Messages] M
    INNER JOIN [dbo].[Users] S ON S.[UID] = M.[Sender]
    INNER JOIN [dbo].[Users] R ON R.[UID] = M.[Receiver]
WHERE @_UID IN(M.[Sender], M.[Receiver])
ORDER BY M.[CreatedDate] DESC;

关于APPLY的用法,和JOIN类似。使用 JOIN 时,您将一组已知结果(例如 table 的内容)组合到另一组同样已知的结果。使用 APPLY 时,不必知道右侧的结果集 - 例如,您可以使用函数根据左侧结果计算结果。