SQL 将两个查询结果合并到一个数据集中

SQL combine two queries result into one dataset

我正在尝试合并两个 SQL 查询,第一个是

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'

我想运行第一个查询的每个用户的第二个查询使用EAC.Person.Id而不是“32”。

我希望在一个数据集中返回所有数据,以便我可以在 Report Builder 中使用它。

我一整天都在为此苦苦挣扎,希望你们中的聪明人能帮帮我。提前致谢。

这样试试;

    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 两个查询即可通过等于 PersonId 数据加入它们,例如 Query1Query2

根据你在评论中的描述,我了解到两个数据集之间的联系实际上是PersonID字段,它存在于EAC.CredentialEAC.Person中;但是,在 EAC.Credential 中,PersonID 存在重复值,您只需要每个 PersonID.

的最新值

有几种方法可以做到这一点,这取决于行数 returned、索引等,但我想也许您正在寻找这样的东西.. .?

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

此选项使用 CROSS APPLY,这意味着第一个数据集的每一行都将根据您描述的条件 return 来自第二个数据集的附加值。在此 CROSS APPLY 中,我加入两个数据集是基于 PersonID 存在于 EAC.Person(在您的第一个数据集中)和 EAC.Credential 中这一事实。然后我指定我只需要每个 PersonIDTOP 1 行,其中 ORDER BY 指定我们需要每个 [=] 的最新(最高)值 ID 11=].

CROSS APPLY 的别名为 "X",因此在您原来的 SELECT 中,您现在有几个以 X. 别名为前缀的值,这意味着您'重新从第二个查询中获取这些字段并将它们附加到您的原始结果中。

CROSS APPLY 要求两个数据子集中都存在匹配条目,很像 INNER JOIN,因此您需要检查并确保相关值存在并且 return编辑正确。

我认为这与您尝试的方向非常接近。如果没有,请告诉我,我会更新答案。祝你好运!