2014-09-18 57 views
2

我試圖在兩個表中運行查詢。讓我們簡化和說,他們在查詢中保留不匹配的數據

表1

| Name | Type | 
+---------+------+ 
| Sam  | A | 
| Jane | A | 
| Steve | B | 

表2

| Name | Value | Date | 
+---------+-------+------+ 
| Sam  | 2  | 2014 | 
| Jane | 2  | 2013 | 
| Sam  | 1  | 2013 | 
| Steve | 1  | 2013 | 

我想要的人患有A型列表,很簡單:

SELECT name FROM table1 WHERE type='A' 

這給

Sam 
Jane 

如預期。我還希望包括他們最近從表2日期:

SELECT name, MAX(date) 
FROM table1 
LEFT JOIN table2 USING(name) 
WHERE type='A' 
GROUP BY name 

這給

Sam 2014 
Jane 2013 

但我不希望包括表2中的項目,除非他們有值1:

SELECT name, MAX(date) 
FROM table1 
LEFT JOIN table2 USING(name) 
WHERE type='A' && value = 1 
GROUP BY name 

哪給出

Sam 2013 

但在這裏我想保留所有匹配的名稱,如下所示:

Sam 2013 
Jane NULL 

我該怎麼做?我應該提到,即使輸出不是(幾百),所涉及的兩個表都很大,所以效率是一個問題,儘管不是一個大問題。

回答

2

您需要將WHERE標準移至JOIN因爲把它的WHERE子句中否定OUTER JOIN

SELECT t.name, MAX(t2.date) 
FROM table1 t 
    LEFT JOIN table2 t2 on t.name = t2.name and t2.value = 1 
WHERE t.type='A' 
GROUP BY t.name 
+0

精美簡單。謝謝! – Charles 2014-09-18 20:25:58

+0

@Charles - 非常歡迎您! – sgeddes 2014-09-18 21:34:59