Sql server ode>是重复的,您希望根据ID字段获得最新的条目吗?字段PersonID似乎来自EAC.Person表。在EAC.WiegandCredential或EAC.Credential中是否有PersonID字段?或者可能是Person表中的Credentia
Sql server ode>是重复的,您希望根据ID字段获得最新的条目吗?字段PersonID似乎来自EAC.Person表。在EAC.WiegandCredential或EAC.Credential中是否有PersonID字段?或者可能是Person表中的Credentia,sql-server,report,builder,Sql Server,Report,Builder,ode>是重复的,您希望根据ID字段获得最新的条目吗?字段PersonID似乎来自EAC.Person表。在EAC.WiegandCredential或EAC.Credential中是否有PersonID字段?或者可能是Person表中的CredentialID?Person表中没有CredentialID,EAC.WiegandCredential有PinCode]、[CardCode]、[SiteCode]、[LastPrintedUTC]、[CredentialID]。EAC.Creden
ode>是重复的,您希望根据
ID
字段获得最新的条目吗?字段PersonID
似乎来自EAC.Person
表。在EAC.WiegandCredential
或EAC.Credential
中是否有PersonID
字段?或者可能是Person
表中的CredentialID
?Person表中没有CredentialID,EAC.WiegandCredential有PinCode]、[CardCode]、[SiteCode]、[LastPrintedUTC]、[CredentialID]。EAC.Credential有一个PersonId。EAC.Credential表中有很多记录,有很多重复的PersonId;我需要那些ID最高的,所以我从那里得到最后一条插入的记录。EAC.Credential有[Id]、[IsActive]、[ActivationDateUTC]、[ExpirationDateUTC]、[ExternalId]、[PersonId]、[CustomerID]、[ServerID]字段,因此如果我理解正确,第一个数据集和第二个数据集之间的唯一连接是PersonId
,它存在于EAC.Person
和EAC.Credential
中;但是在EAC.Credential
中,PersonID
是重复的,您需要根据ID
字段的最新条目?OP在评论中提到,他只需要EAC.Credential
中的PersonID
的最新行。你的方法会奏效,但你需要添加一个TOP
子句。谢谢你的解释,我更新了我的答案。但是对于每个人最近的一行“EAC.Credential”,您的解决方案更好。这与上面的查询一样非常有效,但是这里我也为每个用户获得了5个重复的结果。我有5个组,但并非所有组中都有。OP在评论中提到,他只想要PersonID
的EAC.Credential
的最新一行。你的方法会奏效,但你需要添加一个TOP
子句。谢谢你的解释,我更新了我的答案。但是对于每个人最近的一行“EAC.Credential”,您的解决方案更好。这与上面的查询一样非常有效,但是这里我也为每个用户获得了5个重复的结果。我有5个小组,但不是每个人都在所有的小组中。这非常接近我需要的,但是我得到了每个人5个重复的结果,我检查了我的小组,有5个小组,所以这可能是原因。有什么想法吗?意思是每个PersonID
在EAC.Group
表中存在5次?我添加了DISTINCT,现在似乎有效,我从155个结果增加到31个结果。我想你们都明白了。我将做更多的测试,并向您报告。非常感谢,不用担心<代码>清晰有时可能有点混乱。如果复制背后有一个逻辑原因,我只需要理解它,我们也可以解决它。我能看到的唯一原因是5个组,似乎查询贯穿了这些组,并为每个用户添加了一个结果。我不知道如何解释,但这是我能想到的一切这非常接近我需要的,但是我得到了每个人5个重复的结果,我检查了我的组,有5个组,所以这可能是原因。有什么想法吗?意思是每个PersonID
在EAC.Group
表中存在5次?我添加了DISTINCT,现在似乎有效,我从155个结果增加到31个结果。我想你们都明白了。我将做更多的测试,并向您报告。非常感谢,不用担心<代码>清晰有时可能有点混乱。如果复制背后有一个逻辑原因,我只需要理解它,我们也可以解决它。我能看到的唯一原因是5个组,似乎查询贯穿了这些组,并为每个用户添加了一个结果。我不知道该怎么解释,但这就是我所能想到的
SELECT
EAC.Person.FirstName,
EAC.Person.Id,
EAC.Person.LastName,
EAC.Person.EmployeeId,
EAC.Person.IsDeleted,
Controller.Cards.SiteCode,
Controller.Cards.CardCode,
Controller.Cards.ActivationDate,
Controller.Cards.ExpirationDate,
Controller.Cards.Status,
EAC.[Group].Name
FROM
EAC.Person
INNER JOIN
Controller.Cards ON EAC.Person.Id = Controller.Cards.PersonId
INNER JOIN
EAC.GroupPersonMap ON EAC.Person.Id = EAC.GroupPersonMap.PersonId
INNER JOIN
EAC.[Group] ON EAC.GroupPersonMap.GroupId = EAC.[Group].Id
SELECT
IsActive, ActivationDateUTC, ExpirationDateUTC,
Sitecode + '-' + Cardcode AS Credential, 'Badge' AS Type,
CASE
WHEN isActive = 0
THEN 'InActive'
WHEN ActivationDateUTC > GetUTCDate()
THEN 'Pending'
WHEN ExpirationDAteUTC < GetUTCDate()
THEN 'Expired'
ELSE 'Active'
END AS Status
FROM
EAC.Credential
JOIN
EAC.WiegandCredential ON Credential.ID = WiegandCredential.CredentialId
WHERE
PersonID = '32'
select Query1.*, Query2.* from (
SELECT
EAC.Person.FirstName,
EAC.Person.Id as PersonId,
EAC.Person.LastName,
EAC.Person.EmployeeId,
EAC.Person.IsDeleted,
Controller.Cards.SiteCode,
Controller.Cards.CardCode,
Controller.Cards.ActivationDate,
Controller.Cards.ExpirationDate,
Controller.Cards.Status,
EAC.[Group].Name
FROM
EAC.Person
INNER JOIN
Controller.Cards ON EAC.Person.Id = Controller.Cards.PersonId
INNER JOIN
EAC.GroupPersonMap ON EAC.Person.Id = EAC.GroupPersonMap.PersonId
INNER JOIN
EAC.[Group] ON EAC.GroupPersonMap.GroupId = EAC.[Group].Id)
Query1 inner join (SELECT top 100
IsActive, ActivationDateUTC, ExpirationDateUTC,
Sitecode + '-' + Cardcode AS Credential, 'Badge' AS Type,
CASE
WHEN isActive = 0
THEN 'InActive'
WHEN ActivationDateUTC > GetUTCDate()
THEN 'Pending'
WHEN ExpirationDAteUTC < GetUTCDate()
THEN 'Expired'
ELSE 'Active'
END AS Status
FROM
EAC.Credential
JOIN
EAC.WiegandCredential ON Credential.ID = WiegandCredential.CredentialId
ORDER BY EAC.Credential.ID DESC) Query2 ON Query1.PersonId = Query2.PersonID
SELECT
EAC.Person.FirstName
,EAC.Person.Id
,EAC.Person.LastName
,EAC.Person.EmployeeId
,EAC.Person.IsDeleted
,Controller.Cards.SiteCode
,Controller.Cards.CardCode
,Controller.Cards.ActivationDate
,Controller.Cards.ExpirationDate
,Controller.Cards.Status
,EAC.[Group].Name
,X.IsActive
,X.ActivationDateUTC
,X.ExpirationDateUTC
,X.Credential
,X.Type
,X.Status
FROM EAC.Person
INNER JOIN Controller.Cards
ON EAC.Person.Id = Controller.Cards.PersonId
INNER JOIN EAC.GroupPersonMap
ON EAC.Person.Id = EAC.GroupPersonMap.PersonId
INNER JOIN EAC.[Group]
ON EAC.GroupPersonMap.GroupId = EAC.[Group].Id
CROSS APPLY
(
SELECT TOP 1
IsActive
,ActivationDateUTC
,ExpirationDateUTC
,Sitecode + '-' + Cardcode AS Credential
,'Badge' AS Type
,'Status' =
CASE
WHEN isActive = 0
THEN 'InActive'
WHEN ActivationDateUTC > GETUTCDATE()
THEN 'Pending'
WHEN ExpirationDateUTC < GETUTCDATE()
THEN 'Expired'
ELSE 'Active'
END
FROM EAC.Credential
INNER JOIN EAC.WiegandCredential
ON EAC.Credential.ID = EAC.WiegandCredential.CredentialId
WHERE EAC.Credential.PersonID = EAC.Person.PersonID
ORDER BY EAC.Credential.ID DESC
) AS X
-- Optionally, you can also add conditions to return specific rows, i.e.:
-- WHERE EAC.Person.PersonID = 32