문제

나는 3 개의 테이블 :

  • 부속: Name: 내부 이름, Active: 부
  • 언어: 언어 목록 (영어, 프랑스어, 독일어, ....)
  • 파트 스트립: RealName 그리고 다른 두 테이블 중 ID입니다.

목록을 받고 싶습니다 부속 내부를 말해주십시오 name, active 상태 그리고 누락 된 번역 수

나는이 SQL 쿼리를 내가 필요한 것을 제공하는 것을 만들었습니다 (이것이 더 좋은 방법인지 아닌지는 모르겠지만 작동합니다) :

SELECT 
    parts1.name, 
    parts1.active, 
    (
        (SELECT count(lang.id) 
            FROM languages AS lang) 
        - 
        (SELECT count(trans.id)
            FROM parts AS parts2 
            INNER JOIN partstranslations as trans
            ON parts2.id = trans.partid
            WHERE parts2.id = parts1.id)        
    )
from parts as parts1;

1º 질문- Castle ActiveRecord를 사용 하여이 쿼리를 어떻게 만들 수 있습니까?

2º 질문- 최종 쿼리의 성능은 어떻습니까 (비싼 쿼리)?

감사

도움이 되었습니까?

해결책

ActiveRecord 에서이 쿼리를 만들 수있었습니다. HqlBasedQuery, 그래서 나는 나와 같은 상황에서 다른 사람들을 돕기 위해 여기에 답을 게시합니다.

HqlBasedQuery query = new HqlBasedQuery(typeof(Part),
 @"
    SELECT                     
        par.Id, 
        par.Name, 
        par.Active,                                         
        (SELECT count(*) - count(trans) FROM Language)                                                            
    FROM Part par
        LEFT JOIN par.PartsTranslations trans
    GROUP BY par.Id, par.Name, par.Active, trans.Part
    ");
query.SetQueryRange(startId, currentPageSize);

var results = from object[] summary in
              (ArrayList)ActiveRecordMediator.ExecuteQuery(query)
          select new PartProjection
          {
              Id = (int)summary[0],
              Name = (string)summary[1],
              Active = (bool)summary[2],
              TransMissing = (long)summary[3]                                       
          };

나는 또한이 쿼리에 대한 페이지 매김이 있었고 강력한 타이핑을 제공합니다. PartProjection 사물. 이 클래스에는 ActiveRecord 매개 변수가 필요하지 않습니다.

다른 팁

ActiveRecord를 도울 수는 없지만이 쿼리는 상관 관계가있는 하위 쿼리보다 더 잘 수행해야합니다.

SELECT
    p.name,
    p.active, 
    (SELECT count(*) FROM languages) - count(pt.divid)
FROM
    Parts p
    LEFT JOIN PartsTranslations pt ON p.id=pt.divid
GROUP BY p.id, p.name, p.active

또는 상관 관계 서브 쿼리를 사용하려면에서 선택할 필요가 없습니다. Parts 다시 :

SELECT 
    p.name, 
    p.active, 
    (SELECT count(*) FROM Languages) - 
    (SELECT count(*) FROM PartsTranslations WHERE divid = p.id)            
FROM Parts p;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top