如果我有一个具有以下属性的表:
A:id,种族,key1 B:key1,driving_id C:driving_id,罚款
为什么我们可以进行以下查询:
select A.id, A.race, B.key1, B.driving_id, C.fines
from A
left join B on A.key1=B.key1
left join C on B.driving_id= C.driving_id
即使在SQL查询的最后一行中没有用于A和C的通用键?
答案 0 :(得分:2)
您编写的查询被解析为:
select A.id, A.race, B.key1, B.driving_id, C.fines
from (A left join
B
on A.key1 = B.key1
) left join
C
on B.driving_id = C.driving_id;
也就是说,C
在逻辑上被连接到A
和B
的结果中。这些表中的任何键都是有效的。
尽管您最好使用原始查询来编写它,但是您也可以编写:
select ab.id, ab.race, ab.key1, ab.driving_id, C.fines
from (select . . . -- whatever columns you need
from A left join
B
on A.key1 = B.key1
) ab left join
C
on ab.driving_id = C.driving_id;
这三个版本都是等效的,但最后一个版本可以帮助您更好地了解多个表之间的联接的情况。
答案 1 :(得分:0)
如果没有看到三个表中的示例数据,我们可能不确定在查询中是否有意义,甚至无法运行。假设它确实在运行,那么联接逻辑应该没有任何问题。例如,表B
完全有可能拥有与key1
表相关的键A
,而同时又有另一个与表driving_id
相关的键C
B
表。请注意,这两个键中的一个(但不是两个)都可以是@Table(name = "GAME", schema = "PUBLIC")
表中的主键,如果不是,则每个键都是外键。
答案 2 :(得分:0)
LEFT JOIN关键字返回左表(tableA)中的所有记录,并返回右表(tableB)中的匹配记录。此外,类似地,它从第一组结果中返回所有记录,并从右表(tableC)中返回匹配的记录。如果不匹配,则结果从右侧为NULL。
所以A和C在表B中有一个链接。