【问题标题】:How to combine these two SQL queries如何组合这两个 SQL 查询
【发布时间】:2019-02-16 03:35:09
【问题描述】:

我有两个格式相同但又不相关的 SQL 查询。

SELECT TOP (100) PERCENT 
    dbo.[Case].Id AS CaseId,
    dbo.[Case].State, dbo.[Case].StartDate, dbo.[Case].Description,
    dbo.[Case].OrderNumber, dbo.[Case].LastUpdatedDate,
    dbo.[User].Name AS CompanyUserName, 
    User_1.Name AS ResponsibleCompanyUserName,
    User_2.Name AS CustomerName, dbo.Property.Address,
    dbo.[Case].CompanyId, dbo.[Case].PartnerSettingId
FROM
    dbo.[User] AS User_2
INNER JOIN 
    dbo.Property ON User_2.Id = dbo.Property.UserId
RIGHT OUTER JOIN 
    dbo.[Case] ON dbo.Property.Id = dbo.[Case].PropertyId
LEFT OUTER JOIN 
    dbo.[User] AS User_1 ON dbo.[Case].ResponsibleCompanyUserId = User_1.Id
LEFT OUTER JOIN 
    dbo.[User] ON dbo.[Case].CompanyUserId = dbo.[User].Id
WHERE
    (dbo.[Case].DisableNotifications = 0)
    AND (dbo.[Case].IsDeleted IS NULL)
    AND (dbo.[Case].OrderNumber IS NOT NULL)

SELECT TOP (100) PERCENT 
    dbo.[Case].Id AS CaseId,
    dbo.[Case].State, dbo.[Case].StartDate, dbo.[Case].Description,
    dbo.[Case].OrderNumber, dbo.[Case].LastUpdatedDate,
    dbo.[User].Name AS CompanyUserName, 
    User_1.Name AS ResponsibleCompanyUserName,
    User_2.Name AS CustomerName, dbo.Property.Address,
    dbo.[Case].CompanyId, dbo.[Case].PartnerSettingId
FROM
    [dbo].[CaseMessage] 
WHERE
    UserId != 55 
    AND [CaseId] = 245 
    AND [ReadTimestamp] IS NULL

两者都单独工作,我想将它们组合成一个,第二个查询将结果数添加到主 SQL 结果中。我想在第二个查询中的 caseId 等于主 SQL 中 current 的 caseId 的地方加入它们。 CaseId 将由最终实现中的过程提供。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    如果你的意思是我认为你的意思:

        SELECT        TOP (100) PERCENT dbo.[Case].Id AS CaseId, dbo.[Case].State, dbo.[Case].StartDate, dbo.[Case].Description, dbo.[Case].OrderNumber, dbo.[Case].LastUpdatedDate, dbo.[User].Name AS CompanyUserName, 
                             User_1.Name AS ResponsibleCompanyUserName, User_2.Name AS CustomerName, dbo.Property.Address, dbo.[Case].CompanyId, dbo.[Case].PartnerSettingId
    FROM            dbo.[User] AS User_2 INNER JOIN
                             dbo.Property ON User_2.Id = dbo.Property.UserId RIGHT OUTER JOIN
                             dbo.[Case] ON dbo.Property.Id = dbo.[Case].PropertyId LEFT OUTER JOIN
                             dbo.[User] AS User_1 ON dbo.[Case].ResponsibleCompanyUserId = User_1.Id LEFT OUTER JOIN
                             dbo.[User] ON dbo.[Case].CompanyUserId = dbo.[User].Id
    WHERE        (dbo.[Case].DisableNotifications = 0) AND (dbo.[Case].IsDeleted IS NULL) AND (dbo.[Case].OrderNumber IS NOT NULL)
    
    
    UNION ALL
    
        SELECT        TOP (100) PERCENT dbo.[Case].Id AS CaseId, dbo.[Case].State, dbo.[Case].StartDate, dbo.[Case].Description, dbo.[Case].OrderNumber, dbo.[Case].LastUpdatedDate, dbo.[User].Name AS CompanyUserName, 
                             User_1.Name AS ResponsibleCompanyUserName, User_2.Name AS CustomerName, dbo.Property.Address, dbo.[Case].CompanyId, dbo.[Case].PartnerSettingId
    FROM [dbo].[CaseMessage] where UserId != 55 and [CaseId] = 245 and [ReadTimestamp] IS NULL
    

    【讨论】:

    • 几乎我认为 UserId != 55 and [CaseId] = 245 and [ReadTimestamp] IS NULL - 245 是来自主查询的 dbo.[Case].Id 所以看一下并获取计数对于在主查询中选择的所有
    • 所以,将主查询添加到 UNION ALL 之后的第二个选择中
    【解决方案2】:

    你可以基于CaseId在两个查询之间进行连接

    with cte1 as
        (
        SELECT        TOP (100) PERCENT dbo.[Case].Id AS CaseId, dbo.[Case].State, dbo.[Case].StartDate, dbo.[Case].Description, dbo.[Case].OrderNumber, dbo.[Case].LastUpdatedDate, dbo.[User].Name AS CompanyUserName, 
                                 User_1.Name AS ResponsibleCompanyUserName, User_2.Name AS CustomerName, dbo.Property.Address, dbo.[Case].CompanyId, dbo.[Case].PartnerSettingId
        FROM            dbo.[User] AS User_2 INNER JOIN
                                 dbo.Property ON User_2.Id = dbo.Property.UserId RIGHT OUTER JOIN
                                 dbo.[Case] ON dbo.Property.Id = dbo.[Case].PropertyId LEFT OUTER JOIN
                                 dbo.[User] AS User_1 ON dbo.[Case].ResponsibleCompanyUserId = User_1.Id LEFT OUTER JOIN
                                 dbo.[User] ON dbo.[Case].CompanyUserId = dbo.[User].Id
        WHERE        (dbo.[Case].DisableNotifications = 0) AND (dbo.[Case].IsDeleted IS NULL) AND (dbo.[Case].OrderNumber IS NOT NULL)
        ),
        cte2 as
        (select TOP (100) PERCENT dbo.[Case].Id AS CaseId, dbo.[Case].State, dbo.[Case].StartDate, dbo.[Case].Description, dbo.[Case].OrderNumber, dbo.[Case].LastUpdatedDate, dbo.[User].Name AS CompanyUserName, 
                         User_1.Name AS ResponsibleCompanyUserName, User_2.Name AS CustomerName, dbo.Property.Address, dbo.[Case].CompanyId, dbo.[Case].PartnerSettingId FROM [dbo].[CaseMessage] where UserId != 55 and [CaseId] = 245 and [ReadTimestamp] IS NULL
        ) select cte1.*,cte2.* from cte1 join cte2 on cte1.CaseId=cte2.CaseId
    

    【讨论】:

    • 几乎 100% 工作,根据我的工作几乎没有变化 - 谢谢
    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多