内部联接顺序在我的查询中很重要

时间:2014-01-16 17:56:59

标签: sql postgresql inner-join

第一次查询

select name, letters, date, count(p.playernumber) as data 
from players p inner join fines f using(playernumber) 
group by playernumber

第二次查询

select name, letters, date, count(p.playernumber) as data 
from fines f inner join players p using(spelersnr) 
group by playernumber

第二个查询时,第一个查询无法运行。我认为内连接的顺序无关紧要?为什么第二个查询能够运行,因为我认为select(聚合除外)中的每一列都必须在组中?

enter image description here

1 个答案:

答案 0 :(得分:3)

非常有趣。这是因为Postgres支持在group by子句中使用主键和唯一键,然后允许与每个键关联的列在select中而没有聚合函数。 ANSI标准支持这一点。

问题是spelersnr含糊不清 - 它可能来自任何一个表。我猜Postgres默认使用第一个表来解析查询。当列是主键时,它就可以了(因为naam等来自该表)。当列不是主键时,则会出现错误。

解决方案很简单:

group by s.spelersnr

我希望Postgres发出一个错误,例如“spelersnr含糊不清” - 这意味着它不知道它来自哪个表。如果您使用on子句而不是using子句,则两个查询都会出现这样的错误。