2014-05-13 23 views
1

我有我的DB这2个表:SQL:创建从2个表打印空值视图时没有记录

LESSONS    RATINGS 
ID | NAME    ID | LESSON | RATING 
1 lesson1   1 1  4 
2 lesson2   2 2  2 
3 lesson3   3 1  5 
4 lesson4   4 4  2 
5 lesson5   5 3  1 
6 lesson6   6 2  5 
7 lesson7   7 6  3 

而且我希望有一个观点,告诉我这样的事情:

LESSONS_RATINGS 
IDL| NAME  | RATING   
1 lesson1 4.5 
2 lesson2 3.5 
3 lesson3 1 
4 lesson4 2 
5 lesson5 NULL 
6 lesson6 3 
7 lesson7 NULL 

但我迄今能够得到的是:

LESSONS_RATINGS 
IDL| NAME  | RATING   
1 lesson1 4.5 
2 lesson2 3.5 
3 lesson3 1 
4 lesson4 2 
6 lesson6 3 

请注意,NULL记录丢失。这就是为什么在表中的评级没有教训5和7的记录我这样做:

CREATE OR REPLACE VIEW `LESSONS_RATINGS` AS 
select 
    `l`.`ID` AS `IDL`, 
    `l`.`NAME` AS `NAME`, 
    CASE WHEN AVG(`lr`.`RATING`) IS NULL THEN NULL ELSE AVG(`lr`.`RATING`) END AS `RATING` 
from 
    `LESSONS` AS `l`, 
    `RATINGS` AS `lr` 
where 
    (`l`.`ID` = `lr`.`ID`) 
group by `l`.`ID`; 
+0

我觉得你的问题是,AVG不能返回NULL。 – durbnpoisn

回答

1

使用的OUTER JOIN

select 
    `l`.`ID` AS `IDL`, 
    `l`.`NAME` AS `NAME`, 
    AVG(`lr`.`RATING`) AS `RATING` 
from 
    `LESSONS` AS `l` LEFT JOIN `RATINGS` AS `lr` 
     ON `l`.`ID` = `lr`.`ID` 
group by `l`.`ID`; 

另外,我不认为有必要对于Case声明 - 您只能使用AVG(lr.rating)

+0

感谢您的快速响应,我已经尝试过,它的功能就像一个魅力!在七分钟内我会接受答案:) – unmultimedio

+0

@ khale912 - 无后顾之忧,很高兴我能帮上忙! – sgeddes