2013-07-04 2 views
2

내 상황에 맞는 쿼리를 작성하는 방법에 대해 머리를 감싸는 데 심각한 문제가 있습니다. 테이블을 올바르게 조인하는 방법에 따라 달라 지겠지만 꽤 많이 나온 것 같습니다. ... 인터넷 검색의 SQL 쿼리 - 테이블 조인 문제

나는이 다음 표 ..

Main: 
ID, WhenDate, InfoText, StatusID, TypeID 

및 ...

Status: 
ID, StatusText  

및 ...

Secondary: 
MainID, WhenDate 

희망을 설명해 주실 수 있습니다. 정보를 얻을 필요가있는 메인에 많은 레코드가 있습니다. WhenDate 및 TypeID를 필터링 할 수 있어야합니다. 또한 StatusID에 연결된 상태 테이블에서 StatusText를 가져와야합니다.
문제 :
테이블의 보조 레코드가 주 레코드에 연결되면 보조 레코드의 모든 레코드는 WhenDate 대신 보조 레코드의 WhenDate가 사용된다는 점을 제외하고 Main의 레코드와 일치해야합니다 본관.
어떤 도움이 크게 감사합니다

등 어떤 종류의로서의 다만 힌트는, 사용하는 조인이나 뭐 ...

+0

여러 조인을 사용하는 경우 원하는 것을 수행 할 수 있습니다. –

+1

어떤 RDBMS를 사용하고 있습니까? 그리고 지금까지 어떤 쿼리를 시도 했습니까? – gustavodidomenico

답변

1

나는 모든 주요 기록은 기존 상태를 의미한다고 가정 상태를 INNER JOIN를 사용하는 경우에도 기록. 그렇지 않은 경우 LEFT JOIN으로 변경할 수 있습니다.

WhenDate의 경우, 보조 항목으로 남겨 둘 수 있습니다. 레코드가 발견되면 Secondary.WhenDate와 비교할 수 있습니다. 그렇지 않으면 Main.WhenDate를 확인하십시오.

SELECT 
    m.ID as MainID, 
    m.WhenDate as MainWhenDate, 
    m.InfoText, 
    m.StatusID, 
    st.StatusText, 
    m.TypeID, 
    s.WhenDate as SecondaryWhenDate, 
    CASE WHEN s.MainID IS NULL THEN 
    m.WhenDate 
    ELSE 
    s.WhenDate 
    END AS ActualWhenDate 
FROM 
    Main m 
    INNER JOIN Status st ON st.ID = m.StatusID 
    LEFT JOIN Secondary s ON s.MainID = m.ID 
WHERE 
    (s.MainID IS NULL AND m.WhenDate = <YourDate> 
    OR 
    s.MainID IS NOT NULL AND s.WhenDate = <YourDate>) 
    AND TypeId = <TypeFilter> 
    AND ... other filters, if you need any ... 
+0

그것은 작동합니다! 고마워! 그것은 눈에 띄게 느리다지만 ... 누구나 그것을 좋아하는 느낌 ???
Dorf

+0

나는 그것에 대해 새로운 질문을하는 것이 좋다고 생각하지만, 많은 사람들이 다음과 같은 질문에 답하기를 열망하지는 않습니다. "어떻게 해야할지 모르겠다. 나를 위해 할 수 있니?". 그래서, 나는 당신에게 당신을 도울 수있는 한 가지 힌트를 줄 것이다 : 색인을 추가하라. :) – GolezTrol