2012-11-07 5 views
0

나는 두 테이블 문서가 이러한부모 - 자식 SQL 쿼리 및 제한

  • DOCUMENT(id),
  • ATTRIBUTE(name, value, doc_fk) 같은 속성을 표시합니다.

나는이 "추상적 인 쿼리"$state$creationDate 두 가지 속성이 있습니다

select top 100 documents 
where $state='COMPLETED' 
order by $creationDate 

처럼 작동하는 쿼리를 실행해야합니다.

한계는 문서가 아니라 속성이며 정렬 및 필터는 두 가지 다른 속성에 있습니다. 최종 쿼리는 필터링 된/정렬 된 속성뿐만 아니라 모든 문서 속성을 반환해야합니다.

매우 복잡한 쿼리로 이것을 작성할 수 있었고 더 나은 대안을 찾고 있습니다. 유용한 경우 내 솔루션을 게시 할 수 있지만, 아마도, 잘못된 방향으로 당신을 가리 키고 싶지 않습니다.

100 개 대신 1000 개를 추가하고 메모리에 필터/정렬을 추가하면 괜찮습니다. 필수 제한 인 100 대신 74와 같이 제한이 정확하지 않을 수도 있지만 너무 멀리는 아닙니다.

추가 "소프트"요구 사항 :

  • 쿼리가 이상한 분석 함수는
  • 는 JPA와 함께 작동합니다 모든 플랫폼에서 사용할 수없는 한 피해야 여러 데이터베이스 (오라클, MySQL과 SQLSERVER)로 작동합니다 (EclipseLink가 2.4.0 구현)

예상 출력이

DOC_ID ATTRIBUTE_NAME   VALUE 
    123  state    COMPLETED 
    123  creationDate  21/11/2012 
    123  userid    someone 
    456  state    COMPLETED 
    ... 
,536,913 같은 것입니다
+0

내 대답을 확인하십시오. 도움이되는지 확인하십시오. – mwangi

답변

0

아, EAV 설계의 결함.

시도해보십시오.

select 
    top 100 
    document.* 

from document 
    inner join attribute astate on document.id = astate.doc_fk 
      and astate.name='state' 
      and astate.value = 'completed' 
    inner join attribute acreation on document.id = acreation.doc_fk 
      and acreation.name='creationdate' 
order by cast(acreation.value as date) 

그러나 EAV 구조를 유지하면 더 복잡해집니다. 문서의 생성 날짜 순서로 결과를 활성화 -

+0

나는 이것이 문서의 모든 속성을 추출하지 않는다고 생각한다. – lorenzo

0
SELECT doc_id, attr_name, attr_val, creationDate FROM 

    (
     SELECT * FROM (
      SELECT 
      doc.id as 'doc_id', attr.name as 'attr_name', null as 'attr_val', attr.value as 'creationDate' 
      FROM 
      ATTRIBUTE attr 
      LEFT JOIN 
      DOCUMENT doc ON attr.doc_fk = doc.id 
      WHERE 
      attr.name='creationDate' 
      ORDER BY creationDate desc; 

     ) AS dt1 


    UNION ALL 


     SELECT * FROM( 
      SELECT 
      doc.id as 'doc_id', attr.name as 'attr_name', attr.value as 'attr_val', null as 'creationDate' 
      FROM 
      ATTRIBUTE attr 
      LEFT JOIN 
      DOCUMENT doc ON attr.doc_fk = doc.id; 
    ) as dt2 


    ) as dt0 GROUP BY doc_id ORDER by creationDate desc LIMIT 100; 

파생 테이블 1 (DT1)이 당신에게 속성 모든 날짜를 제공합니다. (PS MySQL은 TOP하지만, LIMIT 대신를 사용하지 않습니다). 파생 된 테이블 2는 모든 특성을 제공합니다. 모두 "모두"로 묶어서 문서별로 그룹화하고 만든 날짜순으로 정렬 할 수 있습니다. 희망이 올바른 방향입니다.

+0

나는 이것이 문서의 모든 속성을 추출하지 않고 creationDate가 DOCUMENT의 컬럼이 아닌 다른 테이블의 속성이라고 생각한다. – lorenzo

+0

이전 답변을 편집했습니다. 파생 테이블 1 (dt1)은 모든 날짜 속성을 제공합니다. 결과를 문서 작성 날짜별로 정렬 할 수 있습니다.파생 된 테이블 2는 모든 특성을 제공합니다. "모두"로 묶어서 문서별로 그룹화하고 만든 날짜순으로 정렬 할 수 있습니다. – mwangi