2010-07-02 2 views
5

SQL Server 2008을 사용 중이고 x, yz의 세 테이블이 있습니다. 과 z 사이에 다 대다 관계를 만들려면 y이 있어야합니다.다 대다 관계의 최대 값

x  y  z 
--  --  -- 
id xid  id 
     zid sort 

위의 모든 필드는 int입니다.

x에 대해 sort이 가장 높은 z을 찾고 최상의 결과를 얻는 방법 (비정규 화 제외)을 찾고 모든 세 개의 테이블에서 모든 필드를 반환하고 싶습니다.

샘플 데이터 :

x: id 
    -- 
     1 
     2 

y: xid zid 
    --- --- 
     1 1 
     1 2 
     1 3 
     2 2 

z: id sort 
    -- ---- 
    1 5 
    2 10 
    3 25 

결과 세트는 하나 이상의 z이 같은 높은 sort 값이 존재하는 경우, 그때는 여전히 x 당 하나 개의 행을 원하는

xid zid 
--- --- 
    1 3 
    2 2 

주의해야한다.

실제 상황에서 세 결과 테이블에 필요한 다른 필드가 있습니다.

+0

난 당신이 실제 상황의 해결책 후있어 가정? 각 테이블에 대해 두 개의 추가 필드를 사용하여 질문을 업데이트하고 검색 할 결과 세트를 정의 할 것을 제안합니다. – MPritchard

+0

이 질문에 그냥 추가하십시오. 데이터베이스 디자인이 고정되었거나 여전히 구현되고 있습니까? 나는 당신의 "정렬"이 z 테이블에 있고 y 테이블에 없다는 것이 이상하다는 것을 알았다. 나는 대개 이와 같은 many to many 관계가 종종 "y"테이블에서 "z"가 관심을 가질만한 정렬이 있음을 발견합니다. 내가 틀렸다면 나를 무시하십시오, 문맥 없이는 알 수 없습니다. –

+0

아직 구현 중이며 여러분이 말하는 것에 동의합니다.하지만 빌드되는 컨텍스트에서 정렬은 'z'테이블에 있어야하며 있어야합니다. – enashnash

답변

0

한 가지 방법은 하위 쿼리입니다. 그러나 이것은 Z의 ID를 얻기 위해서만 유효합니다. x와 z 테이블 모두에서 더 많은/모든 컬럼이 필요하면 이것이 최상의 솔루션이 아닙니다.

SELECT 
    x.id, 
    (
     SELECT TOP 1 
      z.zid 
     FROM 
      y 
     INNER JOIN 
      z 
     ON 
      z.id = y.zid 
     WHERE 
      y.xid = x.id 
     ORDER BY 
      z.sort DESC 
    ) 
FROM 
    x 

이렇게하면 모든 테이블에서 모든 데이터를 반환 할 수 있습니다.

SELECT 
    * 
FROM 
    x 
INNER JOIN 
    y 
ON 
    y.xid = x.id 
AND 
    y.zid = 
(
    SELECT TOP 1 
     z2.zid 
    FROM 
     y y2 
    INNER JOIN 
     z z2 
    ON 
     z2.id = y2.zid 
    WHERE 
     y2.xid = x.id 
    ORDER BY 
     z2.sort DESC 
) 
INNER JOIN 
    z 
ON 
    z.id = y.zid 
+0

님이 질문을 명확히했습니다 – enashnash

+0

모든 데이터를 포함하도록 편집했습니다. –

+0

방금 ​​거미류가 제공하는 솔루션과 비교해 보았습니다. 저의 상황이 8 % 빨랐습니다. – enashnash

0
select xid,max(zid) as zid from y 
group by xid 
+0

max는 zid가 아닌 "sort"에 있어야합니다. 그러므로 이것은 작동하지 않습니다 –

0
select xid, zid /* columns from x; and columns from y or z taken from q */ 
from (select y.xid, y.zid, /* columns from y or z */ 
      row_number() over(partition by y.xid order by z.sort desc) r 
     from y 
      join z on z.id = y.zid 
    ) q 
    join x on x.id = q.xid 
where r = 1 
+0

이것이 내가 찾고있는 것 같아요. 내부 선택 항목에 열을 추가 한 다음 바깥 쪽 열에서 선택하여 세 개의 모든 테이블에있는 모든 열을 가져올 수 있습니다. 이제는 이것이 최상의 수행 방법인지 알아야합니다. – enashnash