2012-11-16 2 views
1

어리석은 질문이지만이 질문에 대한 올바른 검색을 찾을 수 없으며 마음 블록이 있습니다. 참조 테이블의 키가있는 테이블이 있고 중복을 사용하지 않고 레코드를 선택하기 위해 루프를 사용하지 않으려합니다. 모드 1-5를 가져와 중복이 없어도 이름을 얻을 수 있습니다. 내가 명확히 할 수 있도록 의견을 남겨주세요. 동일한 테이블의 여러 외래 키가있는 테이블을 조인하는 방법은 무엇입니까?

모드 (1-5)

있습니다 ModeIDs

예 :

표는이 질문에 대한 답변입니다

ID 
Mode1 
Mode2 
Mode3 
Mode4 
Mode5 

참조 표

ModeID 
ModeName 
+1

예제 입력 및 출력을 고려하십시오. –

+0

DB가 Join Table이 아니라 왜 이렇게 설계 되었습니까? – Shmiddty

+0

물어 보지 마시고, 감독관이 저에게 강요하도록 강요했습니다. 우리는 그것을 수정할 시간이 없다. 나는 그 디자인을 원래 가지고 있었다. – xivo

답변

6

가입하기 :

SELECT 
    m1.ModeName, 
    m2.ModeName, 
    m3.ModeName, 
    m4.ModeName, 
    m5.ModeName 
FROM Modes m 
LEFT JOIN Ref m1 on m1.ModeID = m.Mode1 
LEFT JOIN Ref m2 on m2.ModeID = m.Mode2 
LEFT JOIN Ref m3 on m3.ModeID = m.Mode3 
LEFT JOIN Ref m4 on m4.ModeID = m.Mode4 
LEFT JOIN Ref m5 on m5.ModeID = m.Mode5 

하지만 DB 디자인에 문제가 있음을 알려드립니다. 조인 테이블을 사용해야합니다.

+1

분명히 실제로있는 테이블 이름을 채우십시오. – Shmiddty

+0

이것은 완벽합니다. 예, Join 테이블이 정확한지 알고 있습니다. 그게 내 초기 디자인 이었지만 관리자/감독자가이를 승인하지 않았기 때문에 나는 그것을 폐기하고 원하는 것을 만들었습니다. 나는 노력했다. 다시 한 번 감사드립니다! – xivo

+1

이 재미있는 프로젝트를 기대해보십시오. "Mode5를 통해 Mode5 추가" –

1

보기에서 테이블을 unpivoting하면 많은 선택 쿼리에 대해 장기적으로 테이블 디자인을 극복하는 데 도움이 될 것이라고 생각합니다. (특히 누군가가

CREATE VIEW UnpivotedTable AS 
    SELECT 
     ID, Mode, ModeId 
    FROM 
     TableToJoin 
    UNPIVOT (ModeId FOR mode IN (Mode1,Mode2,Mode3,Mode4,Mode5)) AS t 
GO 
조회에 다음 오히려 "고전"PIVOT 쿼리가 될 것이다 (하지만 그건 정말 내 대답의 요점이 아니다

. unpivotting보기 :-) 여섯 번째 모드를 addd하는 천재 생각을 가지고 때 is)

select Id, Mode1, Mode2, Mode3, Mode4, Mode5 
from (
    select 
     Id, Mode, ModeName 
    from 
     UnpivotedTable 
      inner join 
     ReferenceTable 
      on ReferenceTable.ModeId = UnpivotedTable.ModeId 
     ) as sourcetable 
    pivot (
     max(ModeName) 
     for Mode in (Mode1, Mode2, Mode3, Mode4, Mode5) 
     ) as pivotTable 

희망이 있으면 장기적으로 도움이 될 것입니다. 늦게 답변을 드려 죄송합니다

+0

예, 그것은 미래의 프로젝트에 도움이 될 것입니다. 그러나 모드가 증가하지 않을 것이고 나는 세상이이 변화에 동의하지 않는다면 확신 할 것입니다. (다른 사람들이 완성 된 질문에 뭔가를 추가하려고하는 경우에 "날"입니다) 감사합니다. – xivo

관련 문제