2012-11-15 6 views
1

이 테이블은 다음과 같습니다. B.두 테이블을 합치는 것

id boardid schoolid  subject  cnt1 cnt2 cnt3 .... 
================================================================= 
1  20   21   f  
2  20   21   r 
3  20   21   w 
4  20   21   m 
5  20   30   r 
6  20   30   w 
7  20   30   m 

카운트가 단지 정수라고 가정합니다. schoolid = 30에 대해서는 subject = f이 없습니다. 마찬가지로, 대부분의 학교에서 일부 subject dosnt가 존재합니다. 당신은 r, m, f ..

그래서 내가하고 싶은 것을 각 학교에 대한 4 개 일치하는 행이 있으며, dosnt 행은 내가 더미 값을 원하는 존재이다 정당한 r, wschoolid 또는 일부가있을 수 있습니다. 나는 보조 테이블

drop table #A 
Select * into #A FROM 
(
select [subject_s] = 'r', orderNo = 1 
union all 
select [subject_s] = 'w', orderNo = 2 
union all 
select [subject_s] = 'm', orderNo = 3 
union all 
select [subject_s] = 'f', orderNo = 4 
) z 

를 생성하고 일부는 그들에 조인하고 생각하지만, 나는 어떠한 곳이라도하지했습니다. 나는 내부 조인, 왼쪽 외부 조인, 모든 조인을 시도했다. 나는 데카르트 제품을 만들려고 노력했습니다. 나는 orderno을 가지고 있기 때문에 나의 데카르트 제품이 엉망이라고 생각한다. 그래서 주 테이블의 행당 16 개의 행을 만든다. 실제로 이것을 입력하면 orderno을 제거하고 카티 션 곱을 적용한 다음 나중에 orderno를 추가하면 효과가있을 수 있지만 실제로 어떤 것이 있는지 생각해 보는 데 관심이 있습니다. 나는 곤두박질 친다.

최종 결과

id boardid schoolid  subject  cnt1 cnt2 cnt3 .... 
================================================================= 
1  20   21   r  
2  20   21   w 
3  20   21   m 
4  20   21   f 
5  20   30   r 
6  20   30   w 
7  20   30   m 
7  20   30   f 
+0

모든 제목의 테이블이 있습니까? 각 학년에 출제해야하는 모든 과목을 어떻게 결정할 수 있습니까? –

+1

어떤 RDBMS를 사용하고 있습니까? 그리고 최종 결과의 마지막 행에 'id'가 7 인 이유는 무엇입니까? – Lamak

+0

Typo, id는 자동 생성 된 번호입니다. 그리고 임시 테이블을 만들었습니다. 모든 피실험자가 있습니다 (단 4 개만 있습니다) – masfenix

답변

1

다음을 시도해보십시오 :

SELECT S.boardid, S.schoolid, A.[subject], B.cnt1, B.cnt2, B.cnt3 
FROM (SELECT DISTINCT boardid, schoolid FROM YourTable) S 
CROSS JOIN #A A 
LEFT JOIN YourTable B 
    ON B.boardid = S.boardid AND B.schoolid = S.schoolid 
    AND A.[subject] = B.[subject] 
-1

내가 사용하십시오 :

SELECT 
    boardid, schoolid, dist_subject, id, cnt1, ... 
FROM 
    (SELECT 
     boardid, schoolid, dist_subject 
    FROM 
     (SELECT 
      DISTINCT subject AS dist_subject 
     FROM b) s full outer join 
     (SELECT 
      boardid, schoolid 
     FROM b 
     GROUP BY 
      boardid, schoolid ) g) sg LEFT OUTER JOIN 
    b ON 
    sg.boardID = b.boardID AND 
    sg.schoolid = b.schoolID 
    sg.dist_subject = b.subject 
+0

절대 implioct 조인을 사용하지 마십시오. 그것들은 SQl 반 패턴이다. 대신 크로스 조인을 사용하면 스크립트를 유지하는 사람이 의도하지 않은 교차 ​​결합이 아니라 의도 된 것입니다. – HLGEM

0

난 당신이 내가 노력 사용하는 RDBMS 알고하지 않기 때문에 다음 sqlite 및 더 간단한 테이블 :

sqlite> create table schools (name varchar, subject varchar, teacher varchar); 

sqlite> select * from schools; 
School1|Maths|Mr Smith 
School2|English|Jack 
School3|English|Jimmy 
School3|Maths|Jane 
School4|Computer Science|Bob 

sqlite> select 
      schoolnames.name, 
      subjects.subject, 
      ifnull(teachers.teacher, "Unknown") 
     from (select distinct name from schools) schoolnames 
     join (select distinct subject from schools) subjects 
     left join schools teachers 
      on schoolnames.name = teachers.name 
       and subjects.subject = teachers.subject; 

School1|Maths|Mr Smith 
School1|English|Unknown 
School1|Computer Science|Unknown 

School2|Maths|Unknown 
School2|English|Jack 
School2|Computer Science|Unknown 

School3|Maths|Jane 
School3|English|Jimmy 
School3|Computer Science|Unknown 

School4|Maths|Unknown 
School4|English|Unknown 
School4|Computer Science|Bob 
관련 문제