2012-03-01 60 views
0

我有以下數據庫表:MySQL如何使這個子查詢正確運行?

People 
+--------+------------+------------+-----------+ 
| f_ID | F_NAME | STUFF | F_VALUE | 
+--------+------------+------------+-----------+ 
| 1 | Zoe  | blah |  101 | 
| 2 | Jimy  | derka |  202 | 
| 3 | Kate  | shazam |  20 | 
| 4 | Sue  | pow  |  2 | 
+--------+------------+------------+-----------+ 

RESULTS 
+------- ---+------------+ 
| F_ID  | RESULTS | 
+-----------+------------+ 
| 1   |  Good | 
| 4   |  OK | 
+-----------+------------+ 

如何創建一個查詢,顯示像這樣的人表中的所有條目:

+------------+------------+ 
| NAME  | GRADE | 
+------------+------------+ 
| Zoe  |  Good | 
| Jimy  |  N/A | 
| Kate  |  N/A | 
| Sue  |  OK  | 
+------------+------------+ 

我嘗試這樣做查詢,但它不能正常工作:

SELECT 
NAME 
GRADE 
(
SELECT 
p.F_NAME AS NAME, 
r.RESULTS 

FROM People p 
JOIN RESULTS r ON r.F_ID=p.F_ID 

UNION 

SELECT 
p.F_NAME AS NAME, 
"N/A" 

FROM People p 
JOIN RESULTS r ON r.F_ID=p.F_ID 
)a 

回答

2

您應該使用左連接。對於不存在記錄的GRADE,您將得到NULL。在呈現數據時,只需放置N/A而不是null。

select People.F_NAME as NAME, RESULTS.RESULTS AS GRADE 
from People left join RESULTS ON People.f_ID = RESULTS.f_ID 

,或者,如果你想N/A,而不是零,使用IF

select People.F_NAME as NAME, IF(RESULTS.RESULTS is NULL, 'N/A', RESULTS.RESULTS) AS GRADE 
from People left join RESULTS ON People.f_ID = RESULTS.f_ID 

或使用COALESCE(感謝@bfavaretto)

select People.F_NAME as NAME, COALESCE(RESULTS.RESULTS, 'N/A') AS GRADE 
from People left join RESULTS ON People.f_ID = RESULTS.f_ID 
+0

+1,但'COALESCE'代替IF會更簡潔。 – bfavaretto 2012-03-01 02:04:19

+0

@bfavaretto你能舉一個例子嗎?我不確定我是否聽說過COALESCE。謝謝 – stackoverflow 2012-03-01 02:07:04

+0

@bfavaretto同意,更新了答案。 – 2012-03-01 02:10:27

1

可與聯接

實現
SELECT people.f_name, IF(results.grade <> 0, results.grade, 'N/A') from people 
JOIN results USING(f_id) 
1

不使用UNION,你可以使用LEFT JOIN

SELECT a.F_Name, 
     COALESCE(b.Results, 'N/A') Grade 
FROM People a LEFT JOIN Results b ON 
      a.f_IF = b.F_ID