2012-11-15 146 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 

假设计数只是整数。请注意0​​没有subject = f。同样,对于大多数学校而言,存在一些dosnt。您可能有刚刚r, w一个schoolid或一些只是r, m, f ..

所以我想要做的是为每个学校4个一致行,那dosnt行存在我想虚值。我想创建一个辅助表

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是一个自动生成的数字。并且我创建了一个临时表将所有我的主题(只有四个) – 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