2011-02-16 203 views
2

我有一个关于下面的代码片段的问题。我想知道,如果第一个查询没有带来任何结果,我仍然会得到第二个查询的结果吗?mysql左连接查询

select * 
from 
(
    -- first query 
) as query1 
left join 
(
    -- second query 
) as query2 
on query1.id=query2.id 
left join 
(
    -- third query 
) as query3 
on query1.id=query3.id; 

更新

我需要的是一个完整的联接,然而,MySQL不支持的话,这将是仿效这个好办法?

+0

我已更新我的答案以回答您更新的问题。 – btilly 2011-02-16 15:32:49

回答

1

不,你需要做一个正确的连接。

3

答案是否定的。

左连接会从左侧拉出所有结果,并且只会匹配右侧的结果。正确的加入恰恰相反。完整的外连接将从所有结果中提取所有结果,并只加入那些可以加入的结果。

请注意,对于当前数据库,避免完全外连接是明智的,因为它们比其他连接效率低得多。我曾亲自设法击败Oracle和PostgreSQL全连接数量级的,像这样的招数,也可用于模拟完全外部的数据库连接没有他们:

SELECT some_id 
    , MAX(foo) AS foo 
    , MAX(bar) AS bar 
    , MAX(baz) AS baz 
    , MAX(blat) AS blat 
FROM (
     SELECT A.some_id 
     , A.foo 
     , A.bar 
     , NULL as baz 
     , NULL as blat 
     FROM A 
    UNION ALL 
     SELECT B.some_id 
     , NULL as foo 
     , NULL as bar 
     , B.baz 
     , B.blat 
     FROM B 
) AS subquery 
GROUP BY some_id; 

有该查询可能无法正常工作,因为数据库不会计算出空列的类型。有解决方法。最简单的方法是创建一个具有显式列类型的临时表,使用2个插入查询模拟UNION ALL,然后从临时表中查询。

(为我的格式样式的说明,请参见http://bentilly.blogspot.com/2011/02/sql-formatting-style.html。)

0

没有,因为从第二查询结果追加到第一个查询结果。

0

不,因为您已离开加入。首先添加第二个记录。如果没有第一个没有第二个记录可以添加。通过正确的连接可以进行反转。