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 时,不必知道右侧的结果集 - 例如,您可以使用函数根据左侧结果计算结果。
有 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 时,不必知道右侧的结果集 - 例如,您可以使用函数根据左侧结果计算结果。