4张表:
User 用户表
Id
Name数据: 1 用户1
Dossier 档案表
Id
Name
UserId数据: 1 xxx档案 1
2 zzzz档案 1
DossierBehavior 档案行为表
DossierId(档案表的Id)
Behavior (行为)
AdminId
CreateTime数据: 1 Create 1 2019-11-25
1 Update 1 2019-11-29
Admin 管理员表
Id
Name
数据: 1 管理员1 1行为表有多个记录或者没有记录我想查出结果是:
当UserId = 1时Id Name Behavior BehaviorTime AdminName
1 xxx档案 Update 2019-11-29 管理员1
2 zzzz档案 null null null
Behavior表要根据CreateTime升序取第一条。其实就是取时间最近的一条。这是我的查询语句SELECT *FROM [Dossier] d Left JOIN [DossierBehavior] dh ON ( [d].[Id] = [dh].[DossierId] ) Left JOIN [Admin] ad ON ( [dh].[AdminId] = [ad].[Id] ) WHERE ((( [d].[UserId] = 1 ) AND ( [d].[Status] = 1 )) AND ( [dh].[Id] =(SELECT TOP 1 [Id] FROM [DossierBehavior] WHERE ( [DossierId] = [d].[Id] ) ORDER BY [CreateTime] DESC)))
因为第二个档案表的DossierBehavior为空导致第二个档案查询不出结果Id Name Behavior BehaviorTime AdminName
1 xxx档案 Update 2019-11-29 管理员1
除了单独去遍历,有什么处理方法吗?
SELECT *
FROM [Dossier] d Left JOIN
(SELECT * FROM [DossierBehavior] A WHERE NOT EXISTS (SELECT 1 FROM [DossierBehavior] WHERE A.DossierId=DossierId AND CreateTime>A.CreateTime)) dh ON ( [d].[Id] = [dh].[DossierId] )
Left JOIN [Admin] ad ON ( [dh].[AdminId] = [ad].[Id] )
WHERE [d].[UserId] = 1 AND [d].[Status] = 1