代码之家  ›  专栏  ›  技术社区  ›  user3127554

仅检索1行匹配的联接查询

  •  1
  • user3127554  · 技术社区  · 6 年前

    我有以下两张桌子:

    • 用户ID
    • 姓名
    • 类型

    用户公司

    • 用户ID

    单位

    • 公司ID

    我希望所有公司只有一个用户类型5。

    为什么这个查询不起作用?

    SELECT C.Name FROM USER u 
    JOIN UserCompany UC on u.UserID = UC.UserID 
    JOIN Company C on uc.companyID = c.companyID
    WHERE u.Type = 5
    GROUP BY u.name
    HAVING COUNT(u.name) = 1 
    

    1 John 1
    2 Beth 2 
    3 Mike 5
    4 John 5
    

    公司表:

    1 XYZ 
    2 KBC
    3 MMM
    

    1 1 
    1 3
    1 4
    2 3
    2 1
    

    =>应返回公司2,因为它只有1个用户具有类型5

    2 回复  |  直到 6 年前
        1
  •  1
  •   Rich Benner    6 年前

    好的,我已经重新创建了您的示例表,以便我们可以在SSMS中使用它们;

    IF OBJECT_ID('tempdb..#User') IS NOT NULL DROP TABLE #User
    CREATE TABLE #User (UserID int, Name nvarchar(4), Type int)
    INSERT INTO #User (UserID, Name, Type)
    VALUES
     (1,'John',1)
    ,(2,'Beth',2)
    ,(3,'Mike',5)
    ,(4,'John',5)
    
    IF OBJECT_ID('tempdb..#Company') IS NOT NULL DROP TABLE #Company
    CREATE TABLE #Company (CompanyID int, Name nvarchar(3))
    INSERT INTO #Company (CompanyID, Name)
    VALUES
     (1,'XYZ')
    ,(2,'KBC')
    ,(3,'MMM')
    

    UserCompany 用户ID和公司ID与标题的顺序相同。当我看这个的时候,它显示出数据中根本没有用户3。出于这个目的,我将假设它实际上是按顺序排列的CompanyID和UserID。

    IF OBJECT_ID('tempdb..#UserCompany') IS NOT NULL DROP TABLE #UserCompany
    CREATE TABLE #UserCompany (CompanyID int, UserID int)
    INSERT INTO #UserCompany (CompanyID, UserID)
    VALUES
     (1,1)
    ,(1,3)
    ,(1,4)
    ,(2,3)
    ,(2,1)
    

    SELECT
        c.Name AS Company_Name
        ,COUNT(u.UserID) Employees
    FROM #Company c
    INNER JOIN #UserCompany uc 
        ON c.CompanyID = uc.CompanyID
    INNER JOIN #User u 
        ON uc.UserID = u.UserID
        AND u.Type = 5
    GROUP BY c.Name
    HAVING Count(u.UserID) > 1
    

    Company_Name    Employees
    XYZ             2
    
        2
  •  0
  •   Yogesh Sharma    6 年前

    我只想更新一下 HAVING 条款:

    SELECT UC.companyID 
    FROM USER u JOIN 
         UserCompany UC 
         ON u.UserID = UC.UserID JOIN 
         Company C 
         ON uc.companyID = c.companyID
    GROUP BY UC.companyID
    HAVING SUM(CASE WHEN U.TYPE = 5 THEN 1 ELSE 0 END) = 1;