TSQL交叉应用未按预期工作

时间:2015-10-23 12:50:40

标签: tsql cross-apply

有3张桌子:

  • 用户
  • Depts(虽然查询似乎没有必要,但......)
  • 消息

用户:

       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
        ......

Depts:

       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

我需要创建一个列表,其中包含相同部门的所有用户(输入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;

可以提出错误的建议吗?

由于

1 个答案:

答案 0 :(得分:1)

老实说,我无法确切地知道您的查询正在尝试做什么。但是,通过查看您链接的页面和问题描述,听起来您希望查询填充用户列表(当前用户除外),而另一个用于获取与该用户相关的消息。

考虑类似的事情:

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时,您将一组已知的结果(例如表的内容)组合到另一组已知的结果中。使用APPLY时,不一定必须知道右侧结果集 - 例如,您可以使用函数根据左侧结果计算结果。