我试图获取表B的所有行的列表,如果给出,则从表A中获取匹配的名称,但我的结果不符合要求:/
如果你能提供帮助,会很好。)
这里是(精简的)代码:
表A:
ID | Name | …
1 | foo | …
2 | bar | …
3 | baz | …
表B:
ID | A_ID | …
1 | 1 | …
2 | 3 | …
3 | 2 | …
4 | 1 | …
5 | NULL | …
我的查询:
SELECT B.ID, A.Name FROM A, B WHERE B.A_ID = A.ID OR B.A_ID IS NULL ORDER BY B.ID ASC
我想要的输出是这样的:
1 | foo
2 | baz
3 | bar
4 | foo
5 | NULL or ''
但它是:
1 | foo
2 | baz
3 | bar
4 | foo
5 | foo <-- huh?
非常感谢!
编辑:好吧LEFT JOIN的东西适用于简单的设置,但是在我的真实查询中我从5个表中获取东西并且它看起来我不能将2个表传递到JOIN中 - 或者我只是过于转储:(< / p>
SELECT
c.name as c_name,
a.name as a_name,
p.name as p_name,
e.memo
FROM
e, c, x, a, p
WHERE
e.id = x.e_id AND c.id = x.c_id
AND a.id = e.a_id
AND (p.id = e.p_id OR e.p_id IS NULL)
答案 0 :(得分:0)
始终使用显式JOIN
语法。首先,您将了解LEFT JOIN
,这是您想要的:
SELECT B.ID, A.Name
FROM B LEFT JOIN
A
ON B.A_ID = A.ID
ORDER BY B.ID ASC;
答案 1 :(得分:0)
看起来LEFT JOIN
就是你想要的
SELECT
B.ID,
A.NAME /* Will be null if A record doesn't exist */
FROM B
LEFT JOIN A ON B.A_ID = A.ID
ORDER BY B.ID ASC
答案 2 :(得分:0)
如果你不想在前面的表中找到所有匹配项,那么你使用左连接,那么你没有指定你想在where中找到空值,因为那样只能找到空值。
SELECT B.ID, A.Name FROM A
LEFT JOIN B
ON B.A_ID = A.ID
ORDER BY B.ID ASC