簡體   English   中英

使用左表的條件執行右外部聯接

[英]Perform right outer join with a condition for left table

我有兩張桌子

學生:

rollno  | name 
1       | Abc
2       | efg
3       | hij
4       | klm

出席:

name | date       |status
Abc  | 10-10-2013 | A
efg  | 10-10-2013 | A
Abc  | 11-10-2013 | A
hij  | 25-10-2013 | A

我需要的輸出是:

一些查詢條件條件為“ '10 -09-2013'和'13 -10-2013'之間的日期”

rollno| name |count
1     | Abc  | 2
2     | efg  | 1
3     | hij  | 0
4     | klm  | 0

我嘗試使用:

SELECT p.rollno,p.name,case when s.statuss='A' then COUNT(p.rollno) else '0' end as count 
from    attendance s 
        right outer join student p 
            on s.rollno=p.rollno 
where   s.date between '10-09-2013' and '13-10-2013' 
group by p.rollno,p.regno,p.name,s.statuss 
order by p.rollno

輸出為:

rollno| name |count
1   | Abc  | 2
2   | efg  | 1

我希望來自student表的其余值也要附加。 我嘗試了許多不同的查詢,但都沒有成功。 是否有查詢將返回上面的所需輸出?

您需要將條件從何處移動到聯接:

SELECT p.rollno,p.name,case when s.statuss='A' then COUNT(p.rollno) else 0 end as count 
from    attendance s 
        right outer join student p 
            on s.rollno=p.rollno 
            and s.date between '10-09-2013' and '13-10-2013' 
group by p.rollno,p.regno,p.name,s.statuss 
order by p.rollno;

目前,即使您具有外部聯接,也可以通過在where子句中引用外部表將其有效地轉換為內部聯接。 如果attendance不匹配,則s.Date將為NULL ,並且由於NULL不在'10-09-2013' and '13-10-2013'因此將排除行。

從這個問題來看並不明顯,但我想想您實際上正在尋找的是這個。 看來您只是在按學生人數計入狀態為“ A”的條目數之后:

SELECT  p.rollno,
        p.name,
        COUNT(s.statuss) as count 
from    attendance s 
        right outer join student p 
            on s.rollno=p.rollno 
            and s.date between '10-09-2013' and '13-10-2013' 
            AND s.statuss = 'A'
group by p.rollno,p.regno,p.name,
order by p.rollno;

我從組中刪除了s.statuss,並更改了計數,以使每個學生只有一行,而不是每個學生每個狀態只有一行。 我已將計數內的列更改為出勤狀態表中的一列,以確保當沒有出勤記錄時您得到的計數為0。 如果您在學生中使用一列,即使沒有條目,您也會得到1的計數。 最后,由於您僅對狀態statuss = 'A'條目感興趣,因此我也將其移至statuss = 'A'條件。

最后一點,建議在使用字符串作為日期時使用不區分文化的格式yyyyMMdd ,因為這是完全明確的, 20130201' is always the 1st February, and never 2nd January, whereas in your query 10-09-2013'可能是9月10日還是10月9日,具體取決於您的設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM