没有通用键的SQL连接

时间:2018-12-27 15:01:40

标签: sql db2

如果我有一个具有以下属性的表:

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的通用键?

3 个答案:

答案 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在逻辑上被连接到AB的结果中。这些表中的任何键都是有效的。

尽管您最好使用原始查询来编写它,但是您也可以编写:

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中有一个链接。