Frage

Ich bin ein MySQL-Benutzer, der einige Dinge über zu MS SQL Server zu portieren versucht.

Ich bin ein paar Tabellen verknüpft, und einige der Spalten über GROUP BY aggregiert werden.

Ein einfaches Beispiel wäre die Mitarbeiter und Projekte sein:

select empID, fname, lname, title, dept, count(projectID)
from employees E left join projects P on E.empID = P.projLeader
group by empID

... das wäre in MySQL arbeiten, aber MS SQL ist strenger und erfordert, dass alles, was entweder in einer Aggregatfunktion eingeschlossen ist oder ein Teil der GROUP BY-Klausel ist.

Also, natürlich, in diesem einfachen Beispiel gehe ich davon aus ich nur konnte die zusätzliche Spalten in der Gruppe durch Klausel enthalten. Aber die eigentliche Abfrage ich zu tun habe ist ziemlich kompliziert und beinhaltet eine Reihe von Operationen auf einige der nicht aggregierten Spalten durchgeführt ... das heißt, es wäre wirklich hässlich zu versuchen, alle von ihnen in der Gruppe durch Klausel aufzunehmen, .

So gibt es einen besseren Weg, dies zu tun?

War es hilfreich?

Lösung

Sie können bekommen es mit etwas um diese Linien zu arbeiten:

select e.empID, fname, lname, title, dept, projectIDCount
from
(
   select empID, count(projectID) as projectIDCount
   from employees E left join projects P on E.empID = P.projLeader
   group by empID
) idList
inner join employees e on idList.empID = e.empID

Auf diese Weise vermeiden Sie die zusätzliche Gruppe von Operationen, und Sie können alle Daten, die Sie wollen. Auch Sie haben eine bessere Chance, gute Verwendung von Indizes auf einigen Szenarien zu machen (wenn Sie nicht die volle Info Rückkehr) und können besser mit Paging kombiniert werden.

Andere Tipps

„Es wäre wirklich hässlich zu versuchen, alle von ihnen in der Gruppe durch Klausel aufzunehmen.“

Yup - das ist der einzige Weg, um es * zu tun - einfach kopieren und die nicht aggregierten Spalten in die Gruppe durch Klausel einfügen, entfernen Sie den Alias-Namen und das ist so gut wie es geht ...

* Sie könnte es in einer verschachtelten SELECT wickeln, aber das ist wahrscheinlich genauso hässlich ...

MySQL ist ungewöhnlich - und technisch nicht konform mit dem SQL-Standard - in dem Sie Elemente aus der GROUP BY-Klausel zu verzichten. Im Standard-SQL, die jeweils nicht-Aggregat Spalte in der Auswahlliste muss vollständig in den GROUP BY-Klausel aufgeführt werden (entweder nach Namen oder Ordnungszahl, aber das ist veraltet).

(Oh, obwohl MySQL ungewöhnlich ist, ist es schön, dass es die Kurz erlaubt.)

Sie müssen nicht in der Unterabfrage beitreten, da es nicht notwendig Gruppe zu machen, indem basierend auf empID von Mitarbeitern - Sie kann es auf Projektleiter Bereich von Projekten tun.

Mit dem inneren Verknüpfung (wie ich setze) Sie Liste der Mitarbeiter erhalten, die mindestens ein Projekt hat. Wenn Sie Liste aller Mitarbeiter wollen einfach nur ändern beitreten nach links

  select e.empID, e.fname, e.lname, e.title, e.dept, p.projectIDCount
    from employees e 
   inner join ( select projLeader, count(*) as projectIDCount
                  from projects
                 group by projLeader
              ) p on p.projLeader = e.empID

Eine Unterabfrage in der select-Klausel könnte auch geeignet sein. Es wäre für das Beispiel arbeiten gegeben, aber vielleicht nicht für die eigentliche komplizierte Abfrage, die Sie beschäftigen sich mit.

select
        e.empID, fname, lname, title, dept
        , (select count(*) from projects p where p.projLeader = e.empId) as projectCount
from
   from employees E
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top