2016-08-10 2 views
0

Ich habe 3 Tabellen, die ich schließe, um die Daten zu erhalten, die ich will, company_details, officer_details und company_officer, die die beiden verbinden. Meine Anfrage nimmt jetzt Offiziere, die für mehr als 2 Firmen arbeiten und nicht zurückgetreten sind.Auswahl weglassen, wenn weniger als 2 Werte gefunden werden

Ich möchte zu dieser Abfrage hinzufügen, um nur Unternehmen zu erhalten, die mehr als 1 Arbeiter haben (nach der Anwendung aller vorherigen Anforderungen). S

Company_Details

enter image description here Company_Officer

enter image description here

Officer_Details

enter image description here

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; 

Im i Magier unten sehen Sie das Ergebnis meiner aktuellen Anfrage. Die hervorgehobenen 2 Zeilen möchte ich weglassen, da man sieht, dass diese Firmen nur einen Angestellten haben und ich mich von dieser Auswahl von Firmen mit nur einem Angestellten befreien will.

enter image description here

Antwort

2

fügen Sie einfach ein anderes Prädikat der Where-Klausel

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; 

auch, man konnte das zweite Prädikat vereinfachen mit Exists statt 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; 
+0

Danke für die Antwort, aber ich habe habe das gerade ausprobiert und ich bekomme 1052 Ergebnisse, das ist das selbe wie meine Abfrage. Firmen mit einzelnen Mitarbeitern werden nicht ausgelassen. – Higeath

+0

Hatte das existiert rückwärts, versuchen Sie es erneut –

+0

Die ältere Abfrage gibt mir noch 1052 Ergebnisse und die neue 390 aber es hielt immer noch alle diese Unternehmen mit einem Mitarbeiter. – Higeath

Verwandte Themen