1

Table A             Table AB         Table B
+----+---------+    +-----+-----+    +----+-----+
| id | name    |    | ida | idb |    | id | age |
+----+---------+    +-----+-----+    +----+-----+
|  1 |   'one' |    |   1 |   3 |    |  3 |   3 |
+----+---------+    +-----+-----+    +----+-----+
|  2 |   'two' |    |   2 |   4 |    |  5 |   5 |
+----+---------+    +-----+-----+    +----+-----+
|  3 | 'three' |    |   2 |   5 |
+----+---------+    +-----+-----+

What I want           What I get
+---------+------+    +---------+------+
| name    | age  |    | name    | age  |
+---------+------+    +---------+------+
|   'one' |    3 |    |   'one' |    3 |
+---------+------+    +---------+------+
|   'two' |    5 |    |   'two' |    5 |
+---------+------+    +---------+------+
| 'three' | NULL |    |   'two' | NULL |
+---------+------+    +---------+------+
                      | 'three' | NULL |
                      +---------+------+

我的 sql 是

SELECT A.name, B.age
FROM A
LEFT JOIN AB
  ON A.id = AB.ida
LEFT JOIN B
  ON AB.idb = B.id

约束:我不想Where出于特定原因使用语句,也sub-queries出于性能原因。

有没有办法我只能获取关系 AB 与仅使用JOIN/ON而没有子查询存在的东西相匹配的记录?

4

2 回答 2

2

使用分组。

SELECT A.name, Max(B.age)
FROM A 
LEFT JOIN AB 
  ON A.id = AB.ida 
LEFT JOIN B 
  ON AB.idb = B.id 
GROUP BY a.id, a.Name 
order by a.id

或者你可以使用右连接。

select a.name, b.age
from 
    b 
    inner join ab on b.id = ab.idb
    right join a on ab.ida = a.id
于 2012-10-16T08:30:58.583 回答
2

使用内部而不是外部联接与表B

SELECT A.name, B.age
FROM A LEFT JOIN (
  AB JOIN B ON AB.idb = B.id
) ON A.id = AB.ida

sqlfiddle上查看。

于 2012-10-16T08:33:12.273 回答