在sql中选择多次相同的外键

时间:2016-04-22 14:19:08

标签: sql

我的表foo包含列:

fid, lat, long
1, 0.1, 0.11
2, 0.2, 0.22
3, 0.3, 0.33
4, 0.4, 0.44

和表格bar

bid, f1, f2, f3
1, 1, 2, 3
2, 4, 3, 1

我想为lat表的每个条目获取longf1 f2f3bar

到目前为止,我已经创建了查询:

select
  b.bid,
  f1.lat, f1.long,
  f2.lat, f2.long,
  f3.lat, f3.long
from
  bar as b,
  foo as f1,
  foo as f2,
  foo as f3
where
  b.f1=f1.fid and
  b.f2=f2.fid and
  b.f3=f3.fid;

bid, lat, long, lat, "long", "lat", "long"
1, 0.1, 0.11, 0.2, 0.22, 0.3, 0.33
2, 0.4, 0.44, 0.3, 0.33, 0.1, 0.11

foo.fidbar.bid是主键。我还可以添加表格所需的任何索引。

是否有更快更有效的查询来获得相同的结果?

1 个答案:

答案 0 :(得分:1)

是。不要做旧式连接,做明确的连接。

select
  b.bid,
  f1.lat, f1.long,
  f2.lat, f2.long,
  f3.lat, f3.long
from
  bar as b left join foo as f1 on b.f1 = f1.fid
  left join  foo as f2 on b.f2 = f2.fid
  left join  foo as f3 on b.f3 = f3.fid

当然,假设bid和fid是主要的外键对。

如果您有一个巨大的表,或者它是一个对性能非常敏感的场景,您应该在键上为表添加索引。如果foo中的每个元组(f1,f2,f3)都保证值,则可以使用内连接。