我有一个查询我正试图在两个表中运行。让我们简化并说它们是
表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
正如所料。我还想在Table2中包含他们最近的日期:
SELECT name, MAX(date)
FROM table1
LEFT JOIN table2 USING(name)
WHERE type='A'
GROUP BY name
给出了
Sam 2014
Jane 2013
但我不想在Table2中包含项目,除非它们的值为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
我该怎么做?我应该提一下,所涉及的两个表都很大,即使输出不是(几百个),所以效率是一个问题,尽管不是一个大问题。
答案 0 :(得分: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