我对下面的代码段有疑问。我想知道,如果第一个查询没有带来任何结果,我仍会得到第二个查询的结果吗?
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 :(得分: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。)
答案 1 :(得分:1)
不,你需要做一个正确的加入。
答案 2 :(得分:0)
不,因为第二个查询的结果会附加到第一个查询的结果中。
答案 3 :(得分:0)
不,因为你已离开加入。第二个记录被添加到第一个。如果没有第一个没有记录从第二个可以添加。通过右连接可以实现反转。