에 가입 기본 키, NonAggregateColumn : N AnotherTableNHibernate에 2.1 :</p> <p>SomeTable 1 : LEFT는 별칭 (ICriteria)와 하위 쿼리 기본적으로 내가이 NHibernate에 ICriteria 인터페이스 쿼리 만들기 위해 노력하고
SomeTable은 열이 기본 키, 외래 키, AnotherNonAggregate, YetAnotherNonAggregate
SELECT
table1.NonAggregateColumn,
subquery.SubQueryAggregate1,
subquery.SubQueryAggregate2
FROM
SomeTable AS table1
LEFT JOIN
(
SELECT
table2.ForeignKey,
COUNT(table2.AnotherNonAggregate) AS SubQueryAggregate1,
AVG(table2.YetAnotherNonAggregate) AS SubQueryAggregate2
FROM AnotherTable AS table2
GROUP BY (table2.ForeignKey)
) AS subquery ON subquery.ForeignKey = table1.PrimaryKey
:
AnotherTable은 열이
SQL이 테이블을 두 번 스캔해야하기 때문에 Projection 하위 쿼리를 사용하는 것이 효율적이지 않습니다 (집계 당 하나의 프로젝션 하위 쿼리).
여러 GROUP BY를 사용하는 것도 효율적이지 않습니다.
해결 방법은 있습니까? 지금까지 원시 SQL을 사용하고 있었지만 복잡한 보고서에서는 다루기 힘들게되었습니다.
질문을 명확하게 할 수 있습니까? 표시중인 쿼리는 원시 SQL입니다. 이미 예상 데이터를 반환합니까? 당신은 기준으로 바꾸고 싶습니다. 왜 HQL을 사용하지 않습니까? –
언급을 잊어 버렸습니다 : ORM을 사용 중입니다. 따라서 쿼리를 작성하기 위해 테이블과 외래 키에 대해 신경 쓸 필요가 없습니다. 엔티티와 매핑 정의가 훨씬 더 중요합니다. 그렇다면이 테이블에 매핑되는 방법은 무엇입니까? SomeTable에 목록이 있습니까? AnotherTable에 참조가 있습니까? 아니면 둘다? –
예, 원래 쿼리는 보고서에 필요한 데이터를 반환합니다. 나는 NHibernate 2.1을 사용하고있다. 기준 API는 NHLambdaExtensions를 통한 강력한 입력 기능으로 인해 선호됩니다 (현재 사용하고 있습니다). SQL을 명확하고 쉽게 읽을 수 있도록하기 위해 SomeTable, AnotherTable이라는 이름을 사용하고 있습니다. 그것은 실제 대상의 가상 거울입니다. SomeTable 매핑 된 객체에는 AnotherTable 객체의 역 일대 다 컬렉션이 있습니다. –