每当我要求准备并在Sql Console上运行Join
查询时,我总是很开心和困惑(同时)。
大多数混淆的原因主要是基于连接谓词的排序是否在Join结果中保留任何重要性这一事实。
实施例。
SELECT "zones"."name", "ip_addresses".*
FROM "ip_addresses"
INNER JOIN "zones" ON "zones"."id" = "ip_addresses"."zone_id"
WHERE "ip_addresses"."resporg_accnt_id" = 1
AND "zones"."name" = 'us-central1'
LIMIT 1;
给定sql查询,Join谓词看起来像这样。
... INNER JOIN "zones" ON "zones"."id" = "ip_addresses"."zone_id" WHERE "ip_addresses"."resporg_accnt_id"
现在,它会对Join的性能以及获得结果的真实性产生任何影响。如果碰巧将谓词改为看起来像这样
... INNER JOIN "zones" ON "ip_addresses"."zone_id" = "zones"."id" WHERE "ip_addresses"."resporg_accnt_id"
答案 0 :(得分:3)
在这种情况下,它没有什么区别,简单的平等,但我喜欢将表格中的列放在每个{{1}的LHS上。JOIN
条件:
ON
优化器可以在SELECT ...
FROM ip_addresses ia
JOIN zones z
ON z.id = ia.zone_id
WHERE ...
期间使用这些列上可用的任何索引,我发现以这种方式可视化更容易。
任何其他条件也倾向于在JOIN
的表格的列上,当这个表一直在LHS上时,我再次发现这个读数更好。
我可能也会将您的表顺序轮换到并写下原始查询:
JOIN
从概念上讲,你说"从&us-central1'开始。分区并获取与resporg_accnt_id为1"
相关联的所有ip_addresses检查SELECT z.name,
ia.*
FROM zones z
JOIN ip_addresses ia
ON ia.zone_id = z.id
AND ia.resporg_accnt_id = 1
WHERE z.name = 'us-central1'
LIMIT 1
计划是否要确认您的案例没有区别。