【问题标题】:Omit selection if less than 2 values are found如果找到少于 2 个值,则省略选择
【发布时间】:2016-12-17 05:18:33
【问题描述】:

我加入了 3 个表来获取我想要的数据,company_details、officer_details 和 company_officer 加入了这两个表。我现在的查询需要为超过 2 家公司工作且尚未辞职的官员。

我想添加到此查询中,以仅获取拥有超过 1 名员工的公司(在应用所有之前的要求之后)。 S

公司详情

Company_Officer

Officer_Details

SELECT 
                            CD.Company_ID,
                            CD.Company_Name,
                            CD.Company_Index,
                            OD.Officer_ID,
                            OD.Officer_Name,
                            CO.Officer_Role
                        FROM
                            Company_Details CD
                        INNER JOIN Company_Officer CO 
                           ON CD.Company_ID = CO.Company_ID
                        INNER JOIN Officer_Details OD 
                           ON CO.Officer_ID = OD.Officer_ID
                        WHERE CD.Company_Index<>'' AND 
                              CO.Resigned_On='' AND
                              CO.Officer_ID IN
                               ( SELECT CO2.officer_id
                                 FROM   Company_Officer CO2
                                 INNER JOIN Company_Details CD2
                                 ON CO2.Company_ID = CD2.Company_ID
                                 WHERE CO2.Resigned_On='' AND CD2.Company_Index<>''
                                 GROUP  BY CO2.officer_id
                                 HAVING Count( DISTINCT CO2.company_id ) > 1 
                               )
                        ORDER BY `CD`.`Company_Name` ASC, `CD`.`Company_ID` ASC;

在下图中,您可以看到我当前查询的结果。我想省略突出显示的 2 行,因为您可以看到这些公司只有一名员工,我想摆脱这个只有一名员工的选择公司。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    只需在 Where 子句中添加另一个谓词

    SELECT  CD.Company_ID, CD.Company_Name, CD.Company_Index,
        OD.Officer_ID, OD.Officer_Name, CO.Officer_Role
    FROM Company_Details CD
        JOIN Company_Officer CO 
            ON CD.Company_ID = CO.Company_ID
        JOIN Officer_Details OD 
            ON CO.Officer_ID = OD.Officer_ID
    WHERE CD.Company_Index<>'' 
         AND CO.Resigned_On='' 
         AND CO.Officer_ID IN
            ( SELECT CO2.officer_id
              FROM Company_Officer CO2
                 JOIN Company_Details CD2
                      ON CO2.Company_ID = CD2.Company_ID
              WHERE CO2.Resigned_On='' AND CD2.Company_Index<>''
              GROUP  BY CO2.officer_id
              HAVING Count( DISTINCT CO2.company_id ) > 1)
    And not Exists (Select * from company_officer
                    Where Company_Id = cd.Company_Id 
                    Having count(*) < 1)
    ORDER BY `CD`.`Company_Name` ASC, `CD`.`Company_ID` ASC;
    

    另外,您可以使用Exists 而不是In 来简化第二个谓词

    SELECT  CD.Company_ID, CD.Company_Name, CD.Company_Index,
        OD.Officer_ID, OD.Officer_Name, CO.Officer_Role
    FROM Company_Details CD
        JOIN Company_Officer CO 
            ON CD.Company_ID = CO.Company_ID
        JOIN Officer_Details OD 
            ON CO.Officer_ID = OD.Officer_ID
    WHERE Not Exists
            (Select * FROM Company_Officer
             WHERE officer_id = od.officer_id 
                and Resigned_on = ''
             Having count(*) <= 2)
         And Not Exists 
            (Select * from company_officer
             Where Company_Id = cd.Company_Id 
             Having count(*) <= 1)
    ORDER BY `CD`.`Company_Name` ASC, `CD`.`Company_ID` ASC;
    

    【讨论】:

    • 感谢您的回复,但我刚刚尝试过,我得到了 1052 个结果,这与我的查询相同。没有遗漏有单身员工的公司。
    • 如果存在倒退,再试一次
    • 旧查询给我的结果仍然是 1052,新的查询结果是 390,但它仍然让所有这些公司都只有一名员工。
    • 您的第一个查询:i.imgur.com/gI1GrwG.png 您的新查询:i.imgur.com/IHYJ9My.png 我的查询:i.imgur.com/8OHnjp9.png
    • 根据您在 Company_Officer 中的内容,CompanyId 对于所有行都是 211。这是一个错字,还是数据实际上是这样的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    相关资源
    最近更新 更多