문제

저는 일부 물건을 MS SQL Server로 포트하려고하는 MySQL 사용자입니다.

나는 두 개의 테이블에 가입하고 그룹을 통해 일부 열을 집계하고 있습니다.

간단한 예는 직원과 프로젝트입니다.

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

... MySQL에서 작동하지만 MS SQL은 더 엄격하며 모든 것이 집계 함수로 둘러싸여 있거나 절에 의해 그룹의 일부입니다.

물론이 간단한 예에서는 그룹 별 절에 추가 열을 포함시킬 수 있다고 가정합니다. 그러나 내가 다루고있는 실제 쿼리는 매우 복잡하며, 비 응집 된 열 중 일부에서 수행 된 많은 작업이 포함되어 있습니다 ... 즉, 절에서 모든 것을 그룹에 포함 시키려고 노력할 것입니다. .

더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

이 라인 주위의 무언가와 함께 작동하도록 할 수 있습니다.

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

이렇게하면 작업별로 추가 그룹을 피하고 원하는 데이터를 얻을 수 있습니다. 또한 일부 시나리오에서 인덱스를 잘 활용할 수있는 더 좋은 기회가 있습니다 (전체 정보를 반환하지 않는 경우). 페이징과 더 잘 결합 할 수 있습니다.

다른 팁

"조항 별 그룹에 모든 것을 포함 시키려고 시도하는 것은 정말 추악 할 것입니다."

YUP- 이것이 유일한 방법입니다 * - 외계 열을 복사하여 응집되지 않은 열을 절을 통해 그룹에 붙여 넣고 별명을 제거하면 ...

*중첩 된 선택으로 감을 수 있지만 아마도 못 생겼을 것입니다 ...

MySQL은 비정상적이며 기술적으로 SQL 표준을 준수하지 않으며 절으로 그룹에서 항목을 생략 할 수 있습니다. 표준 SQL에서 선택 목록의 각 비 응집 열은 그룹에 의해 전체에 나열되어 있어야합니다 (이름 또는 서수별로, 그러나 더 이상 사용되지 않음).

(오, MySQL은 비정상적이지만 속기를 허용하는 것이 좋습니다.)

직원의 Empid를 기반으로 그룹을 만들 필요가 없으므로 하위 쿼리에 가입 할 필요는 없습니다. 프로젝트의 프로젝트 리더 필드에서 수행 할 수 있습니다.

내부 가입 (내가 넣은대로)을 사용하면 최소한 하나의 프로젝트가있는 직원 목록을 얻을 수 있습니다. 모든 직원의 목록을 원한다면 왼쪽 가입으로 변경하십시오.

  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

SELECT 절의 하위 쿼리도 적합 할 수 있습니다. 주어진 예제에는 효과가 있지만 실제 복잡한 쿼리에는 적합하지 않을 수 있습니다.

select
        e.empID, fname, lname, title, dept
        , (select count(*) from projects p where p.projLeader = e.empId) as projectCount
from
   from employees E
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top