【发布时间】:2012-02-02 15:10:51
【问题描述】:
我有 3 张桌子 A、B 和 T
T 分别持有表 A 和 B 的外键。
现在我想获取 (A,B,T) 的所有行,即使 T 为空。
SELECT * from
A
LEFT OUTER JOIN T t1 ON t1.A_ID = A.id,
B
LEFT OUTER JOIN T t2 ON t2.B_ID = B.id
WHERE A.B_ID = B.ID
现在的问题是我得到了太多的行,所以我添加了以下内容:
AND t1.id = t2.id
但现在我根本没有得到任何行,这是我首先试图通过包含 LEFT OUTER JOIN 来避免的。
编辑:除了任何示例数据或表格布局之外,我的问题仅仅是,在这种情况下,A + B 是否需要 2 个左外部联接,如上所示或者也许还有另一种方式?
像某些用户建议的那样,在第二个左连接中仅引用表 A 无法正常工作,因为它超出了范围,也解释了
here
因此,如果您将两个表都用括号括起来,它就可以工作:
SELECT * from (A, B)
LEFT OUTER JOIN T t ON t.A_ID = A.id and t.B_ID = B.id
【问题讨论】:
-
我可能理解错了,但是 A.B_ID = B.ID 的目的是什么?您能否发布表定义和示例数据?
-
为了您自己的理智(在某种程度上,我们的理智),请不要混合使用
,和JOIN符号。尝试使用一个,最好是JOIN。此外,您可以 () 查询部分内容,例如(A LEFT JOIN T ON ???) INNER JOIN (B LEFT JOIN T ON ???) ON ??? -
如果这两个表没有任何关系,我们如何使用“on A.B_ID = B.ID”?您给出了“T 持有表 A 和 B 的外键”。
-
您能否提供更多信息 - 表结构和您的预期输出。从问题中不清楚A和B是否相关。如果没有,你想要笛卡尔积吗?