查询行为不符合预期

时间:2013-12-26 14:17:48

标签: sql postgresql join

我有一个问题:

select count(*) as total
from sheet_record right join
     (select * from sheet_record limit 10) as sr
     on 1=1;

如果我理解正确(我认为我没有),右连接假设从左表返回右表中的所有行。它假设列在第10行。但查询只返回1行,其中1列为'total'。并且它将是完全内部连接并不重要,结果总是一样的。

如果我反向表并使用左连接并对查询进行小修改,那么它的工作正确(修改无所谓,因为在这种情况下我得到了我期望得到的)。但是我有兴趣找到我实际上对连接不了解的内容以及为什么这个查询不能按预期工作。

3 个答案:

答案 0 :(得分:1)

您返回一列,因为select包含聚合函数,将其转换为聚合查询。查询应该返回sheet_record表中行数的10倍。

您的查询实际上是一种交叉联接。所以,如果你这样做了:

select *
from sheet_record right join
     (select * from sheet_record limit 10) as sr
     on 1=1;

sheet_record中的每条记录都会获得10行。这些记录中的每一个都会有来自同一个表中十个记录之一的其他列。

答案 1 :(得分:0)

您正在使用count(*)功能,没有任何分组。这几乎会导致检索单行。尝试在没有count()的情况下运行您的查询,看看您是否接近了预期的结果。

答案 2 :(得分:0)

最终在评论员的帮助下,我确实理解了什么是错的。实际上并没有错,但究竟我没有抓到什么。

// this code below is work fine. query will return page 15 with 10 records in.

select *from sheet_record inner join (select count(*) as total from sheet_record) as sr on 1=1 limit 10 offset 140;

我原以为连接需要从左边开始,并使用右表连接。但是当我在脚本上工作的那一刻(上图)我在右侧有一个视图(由子查询构建的表)而不是纯表,我在想左侧和视图,由(select * from sheet_record)制作,这是一个错误。

想法是从表X获取一组记录,其中附加列具有表中记录总数的值。 (当需要使用分页在UI中显示表时,这是常见的问题。要知道仍有多少页可用,我需要知道总共有多少记录,这样我才能计算出仍有多少页可用)

我认为应该是

select * from (
    (here is some subquery which will give a view using count(*) function on some table X and it will be used as left table) 
    right join 
    (here is some subquery which will get some set or records from table X with limit and offset)
    on 1=1 //becouse i need all row from right table(view) in all cases it should be true
)

使用右连接查询会有点复杂。 我正在使用postgres。

所以最终我设法通过正确的加入获得结果

select * from (select count(*) as total from sheet_record) as srt right join (select * from sheet_record limit 10 offset 140) as sr on 1=1;