GVKun编程网logo

sql – 如何重用SELECT,WHERE和ORDER BY子句的结果?(sql重写)

20

最近很多小伙伴都在问sql–如何重用SELECT,WHERE和ORDERBY子句的结果?和sql重写这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展c#–OrderBy子句之前的w

最近很多小伙伴都在问sql – 如何重用SELECT,WHERE和ORDER BY子句的结果?sql重写这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展c# – OrderBy子句之前的where子句 – 性能?、c# – 如何在LinqPad中将Where,Select,OrderBy等应用于存储过程的结果?、Count和Order By Where子句匹配、Groovy SQL忽略动态select语句中的order by子句等相关知识,下面开始了哦!

本文目录一览:

sql – 如何重用SELECT,WHERE和ORDER BY子句的结果?(sql重写)

sql – 如何重用SELECT,WHERE和ORDER BY子句的结果?(sql重写)

以下查询返回我们附近的场地(lat:62.0,lon:25.0),其中我们按照距离排列的半径:
SELECT *,earth_distance(ll_to_earth(62.0,25.0),ll_to_earth(lat,lon)) AS distance 
FROM venues 
WHERE earth_distance(ll_to_earth(62.0,lon)) <= radius 
ORDER BY earth_distance(ll_to_earth(62.0,lon))

是否可以(并且建议)重复使用earth_distance(ll_to_earth(62.0,lon))的结果,而不是单独为SELECT,WHERE和ORDER BY子句计算它?

解决方法

在GROUP BY和ORDER BY子句中,您可以引用列别名(输出列)或甚至SELECT列表项的序号.我引用 the manual on ORDER BY

Each expression can be the name or ordinal number of an output column
(SELECT list item)
,or it can be an arbitrary expression formed from
input-column values.

大胆强调我的.

但是在WHERE和HAVING子句中,您只能引用基表(输入列)中的列,因此您必须拼出函数调用.

SELECT *,lon)) AS dist
FROM   venues 
WHERE  earth_distance(ll_to_earth(62.0,lon)) <= radius 
ORDER  BY distance;

如果您想知道将计算打包到CTE或子查询中是否更快,只需使用EXPLAIN ANALYZE进行测试即可. (我对此表示怀疑.)

SELECT *
FROM  (
   SELECT *,lon)) AS dist
   FROM   venues
   ) x
WHERE  distance <= radius 
ORDER  BY distance;

与@Mike commented一样,通过声明函数STABLE(或IMMUTABLE),您可以通知查询计划程序,对于单个语句中的相同调用,函数调用的结果可以重复使用多次.我引用the manual here:

A STABLE function cannot modify the database and is guaranteed to
return the same results given the same arguments for all rows within a
single statement. This category allows the optimizer to optimize
multiple calls of the function to a single call
.

大胆强调我的.

c# – OrderBy子句之前的where子句 – 性能?

c# – OrderBy子句之前的where子句 – 性能?

我想了解在Where子句之前使用OrderBy子句是否有任何性能下降:
List<string> names = new List<string> { //... };

var ns = names.OrderBy(n => n).Where(n => n.Length == 5);

或者编译器会重新排列指令,以便Where子句在OrderBy子句之前执行吗?

解决方法

它将取决于正在使用的LINQ提供商.对于LINQ to Objects来说,这肯定会有很大的不同.假设我们实际上有:
var query = myCollection.OrderBy(item => item.CreatedDate)
                    .Where(item => item.Code > 3);

var result = query.Last();

这需要对整个集合进行排序并过滤.如果我们有一百万个项目,只有其中一个代码大于3,我们会浪费大量的时间来排序结果,这将被丢弃.

与反向操作进行比较,首先过滤:

var query = myCollection.Where(item => item.Code > 3)
                    .OrderBy(item => item.CreatedDate);

var result = query.Last();

这一次,我们只是排序过滤的结果,在“只有一个匹配过滤器的项目”的示例中,在时间和空间上都将更加高效.

它还可以改变查询是否正确执行.考虑:

var query = myCollection.Where(item => item.Code != 0)
                    .OrderBy(item => 10 / item.Code);

var result = query.Last();

没关系 – 我们知道我们永远不会被0除.但是如果我们在过滤之前执行排序,那么查询将会抛出异常.

c# – 如何在LinqPad中将Where,Select,OrderBy等应用于存储过程的结果?

c# – 如何在LinqPad中将Where,Select,OrderBy等应用于存储过程的结果?

当我尝试从存储过程中过滤或投影结果时,我可以在 LinqPad中出现以下错误.

‘LINQPad.ReturnDataSet’ does not contain a deFinition for ‘Where’ and
no extension method ‘Where’ accepting a first argument of type
‘LINQPad.ReturnDataSet’ Could be found

有解决方法吗?

解决方法

在存储过程的结果上调用AsDynamic()将允许您应用Linq操作,例如spOrders.AsDynamic().Where(o => o.Id> 100)

Count和Order By Where子句匹配

Count和Order By Where子句匹配

我正在为FAQ列表编写一些非常简单的搜索功能。我正在将搜索字符串拆分为各种字符,包括空格。然后根据以下内容执行选择

SELECT *
FROM "faq"
WHERE
    ((LOWER("Question") LIKE '%what%'
   OR LOWER("Question") LIKE '%is%'
   OR LOWER("Question") LIKE '%a%'
   OR LOWER("Question") LIKE '%duck%'))

我不得不对其进行稍微的编辑,使其由我们的数据访问层生成,但是它应该使您对发生的事情有所了解。

上面的查询很好地说明了这个问题,因为大多数问题中可能都包含单词a或is,但是我无法将其过滤掉,因为首字母缩略词对搜索者而言很重要。建议的是,我们根据匹配关键字的数量进行排序。但是,我一直找不到在SQL中执行此操作的方法(我们没有时间用关键字等的索引来创建简单的搜索引擎)。有谁知道是否有一种方法可以计算SQL语句中LIKE匹配的数量并以此排序,以使关键字最多的问题出现在结果的顶部?

Groovy SQL忽略动态select语句中的order by子句

Groovy SQL忽略动态select语句中的order by子句

我在Grails应用程序中使用Groovy sql来查询未连接为应用程序数据源的数据库.对于页面,默认情况下,sql select语句不包含order by子句.如果用户单击其中一个标记,我想动态更改查询以在指定方向上对指定列进行排序.当我尝试将order by子句添加到select语句时,我得到一个(捕获的)sqlException,表明我的查询未正确结束.

我的查询:

sql.eachRow("select * from mytable where type = ''SUMMARY'' and acolumn=${columnValue} order by ${sortColumn} ${sortOrder}") { row ->
                    results << row.toRowResult()
                }

我可以通过对返回的列表进行排序来解决问题,但是如果可能的话,我想在sql语句中执行此操作.这是一个已知的问题吗?

解决方法

这是Groovy试图用你的所有参数替换?并制作PreparedStatement

这不适用于ORDER BY子句,因此您需要use Sql.expand

尝试:

sql.eachRow( "select * from mytable where type = ''SUMMARY'' and acolumn=${columnValue} order by ${sql.expand(sortColumn)} ${sql.expand(sortOrder)}") { row ->
  results << row.toRowResult()
}

关于sql – 如何重用SELECT,WHERE和ORDER BY子句的结果?sql重写的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于c# – OrderBy子句之前的where子句 – 性能?、c# – 如何在LinqPad中将Where,Select,OrderBy等应用于存储过程的结果?、Count和Order By Where子句匹配、Groovy SQL忽略动态select语句中的order by子句的相关知识,请在本站寻找。

本文标签: