这个SQL语句(order by count(*))的含义是什么?

3
这个SQL语句的含义是什么?
select * from tab1 order by (select count(*) from tab2) desc 

3
您使用的是哪个数据库管理系统(DBMS)? - Abe Miessler
@AbeMiessler:这有关系吗?这是标准的SQL,我不知道有哪个数据库服务器会自动连接这两个引用表。 - NotMe
@ChrisLively,执行“JOIN”甚至不在我的视野范围内。我不能说我知道所有存在的DBMS的所有内容,但这似乎可能会在两个不同的DBMS中做两件不同的事情。如果这是真的,那么这将很重要。 - Abe Miessler
使用ORDER BY(标量子查询)没有任何意义,即使它是相关联的也不行。 Order by 1,2,3是有效的,但1,2,3需要在"编译时间"进行评估。它可能是一些扩展,但在这种情况下仍然是不好的风格,因为SELECT *依赖于结果元组中字段的隐含顺序。 - wildplasser
5个回答

4
下面这行代码仅返回tab2中行数的数量,这是一个常数。
select count(*) from tab2

考虑从第1列到最后一列(编号为n)的列。
select * from tab1 order by 1

按照第一列排序。
select * from tab1 order by 2

我希望你能够按第二列等方式排序。如果n大于列数,则会遇到问题。

编辑
然而,您正在使用子查询,并且有

select * from tbl1 order by (select 1000)

如果您的列数<1000,则不会出现问题,但它似乎没有起到作用;查询可能缺少一些信息。


显然,子查询与常量表达式的处理方式不同。"select * from sysobjects order by (select 1)"与"select * from sysobjects order by 1"不同。这是基于MS SQL的。 - galets
你说得对,在子查询中n太大并没有导致错误,我刚刚测试过了,我会进行修改。 - jrafferty
1
我认为只有 ORDER BY NORDER BY (N) 表示按第 N 列排序。ORDER BY 100 抛出错误,ORDER BY (100) 也是如此。但是 ORDER BY (SELECT N) 表示按值排序,无害,但在常量 N 的情况下也毫无意义。 - galets

3
结果应该按照内部查询返回的计数所对应的列的索引在“ORDER BY”子句中进行排序。不知道是谁写的这段代码,特别是没有注释的情况下,应该被绞死并割掉重要的生殖器官。

从技术上讲,那就是结果。然而,实际情况是,如所示的order by子句基本上什么也不做。 - NotMe

2

答案基于Microsoft SQL的功能 [编辑:]其中ORDER BY(子查询)表达式中的子查询表示排序值。

这是我的理解:由于tab2未在子查询中链接到tab1,因此可以将SQL简化为:

select * from tab1 order by (SELECT <CONSTANT>) desc 

因此,它等价于:
select * from tab1

2
“select * from tab1 order by <CONSTANT INTEGER> desc” 不等同于 “select * from tab1”。前者按照第n列排序,其中n是所讨论的整数。 - Jeffrey Blake
你的编辑改进了这个答案,但也有点令人困惑,因为 MS SQL 是一种 DBMS,其中 SELECT * FROM tab1 ORDER BY 3 将按第三列排序。你明确表示你的答案基于一个不正确的 DBMS。 - Jeffrey Blake
1
@JeffreyBlake 我不认为那是正确的。在查询分析器中运行以下查询:select * from dbo.sysobjects order by (select 10000)。将(select 10000)替换为(select 1),或者任何其他数字,你会得到相同的排序结果。 - galets
这是正确的。但是,如果我运行 select * from dbo.sysobjects order by 1000(会产生错误),或者 select * from dbo.sysobjects order by 1(按第一列排序),或者 select * from dbo.sysobjects order by 10(按第十列排序),我会得到非常不同的排序顺序。 - Jeffrey Blake
1
@JeffreyBlake 但这不是他正在运行的。为了进行苹果与苹果的比较,您必须运行 select * from dbo.sysobjects order by (select 1000)select * from dbo.sysobjects order by (select 1)select * from dbo.sysobjects order by (select 10) - galets
1
啊,是的,你编辑后的内容反映了这一点。很奇怪,“order by 10”和“order by (select 10)”有不同的效果。 - Jeffrey Blake

0
坦白地说,这个查询语句只会以某种未知的顺序返回tab1中的所有记录。
order by子句有点愚蠢,因为返回的值将始终是tab2中所有记录的计数。
我怀疑在(select count(*) from tab2)部分缺少where子句。类似于(select count(*) from tab2 t where t.tab1id = tab1.id)。虽然不知道这两个表的结构,很难说。

你的建议中(带有“where…”),在这种情况下会有什么意义? - Natasha

0

ORDER BY 相当于 ORDER BY 'X';也就是说,它没有任何作用。它不会按照第二个查询中 count(*) 引用的列号进行排序——如果第二个表有三行,则它与 order by 3 不等价。

请参见 OracleMySQLSQL Server 的示例。如果 ORDER BY 基于 count(*),则结果应该按照第三列排序。但实际上并没有。此外,count(*)+100 也没有任何效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接