假设我有一个名为 Cars 的表,其中包含 2 列:CarName、BrandName
现在我要执行这个查询:
select CarName
from Cars
order by BrandName
如您所见,我想返回一个按列排序的列表,该列不存在于查询的选择部分。
sql命令的基本(未优化)执行顺序是:from, where, group by, having, select, order by.
出现的问题是,BrandName 不是执行选择命令后剩下的部分。
我在书籍、谷歌和 Stackoverflow 上搜索过这个,但到目前为止我只找到了几个 SO 评论,比如“我知道数据库系统不允许它,但我不记得是哪个一”。
所以我的问题是:
1) 标准是什么SQL-92或者 SQL99 说说这个。
2)哪些数据库允许这个查询,哪些不允许?
(背景:几个学生问这个,我想给他们最好的答案)
编辑:
- 成功测试 Microsoft SQL Server 2012
最佳答案
您的查询是完全合法的语法,您可以按选择中不存在的列进行排序。
如果您需要有关合法排序的完整规范,在 SQL Standard 2003 中有一长串关于排序依据应该包含和不应该包含的内容的语句,(02-Foundation,第 415 页,第 7.13 节
我认为您的困惑可能是由于按组中不存在的列进行选择和/或排序,或者在使用不同时按不在选择中的列进行排序。 两者都有相同的基本问题,据我所知,MySQL 是唯一允许其中任何一个的问题。 问题是这样的,当使用 group by 或 distinct 时,任何不包含在其中的列都不需要,所以如果它们在行中有多个不同的值并不重要,因为它们永远不需要。想象一下这个简单的数据集: 如果你写: 你会得到 如果您随后添加 这同样适用于选择不在分组依据中的列。为简化起见,想象一下上表的前两行: 在MySQL中你可以写 这实际上违反了 SQL 标准,但它在 MySQL 中有效,但问题是它是不确定的,结果: 不比 所以你的意思是为 将确保您获得以下结果: 因为 The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate. Furthermore, the selection of values from each group cannot be influenced by adding an ORDER BY clause. 因此,即使您有订单,但在每组选择一行之后才会应用,并且这一行是不确定的。 SQL 标准确实允许选择列表中的列不包含在 GROUP BY 或聚合函数中,但是这些列必须在功能上依赖于 GROUP BY 中的列。来自 SQL-2003-Standard(5WD-02-Foundation-2003-09 - 第 346 页)- http://www.wiscorp.com/sql_2003_standard.zip 15) If T is a grouped table, then let G be the set of grouping columns of T. In each <value expression> contained
in <select list> , each column reference that references a column of T shall reference some column C that
is functionally dependent on G or shall be contained in an aggregated argument of a <set function specification>
whose aggregation query is QS. 例如,示例表中的ID是PRIMARY KEY,所以我们知道它在表中是唯一的,所以下面的查询符合SQL标准,在MySQL中运行,目前在很多DBMS中都失败(当时编写 Postgresql 是我所知道的最接近正确实现标准的 DBMS - Example here): 由于每一行的 ID 都是唯一的,因此每个 ID 只能有一个 ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
3 | B | Y |
SELECT DISTINCT Column1
FROM T;
Column1
---------
A
B
ORDER BY Column2,您将使用两个 column2 中的哪一个来按 X 或 Z 对 A 进行排序?如何为 column2 选择一个值是不确定的。ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1;
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
Column1 的每个不同值提供一行,两个结果集都满足,那么你怎么知道你会得到哪一个?嗯,你没有,这似乎是一个相当普遍的误解,你可以添加和 ORDER BY 子句来影响结果,例如下面的查询:SELECT ID, Column1, Column2
FROM T
GROUP BY Column1
ORDER BY ID DESC;
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
ORDER BY ID DESC,但这不是真的 (as demonstrated here)。
SELECT ID, Column1, Column2
FROM T
GROUP BY ID;
Column1 值,一个 Column2 值,对于返回什么没有歧义每行。
关于mysql - 哪些 DBMS 允许对 select 子句中不存在的属性进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20356656/
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
我的模型有defself.empty_building//stuffend我怎样才能对这个现有的进行rspec?,已经尝试过:describe"empty_building"dosubject{Building.new}it{shouldrespond_to:empty_building}endbutgetting:Failure/Error:it{shouldrespond_to:empty_building}expected#torespondto:empty_building 最佳答案 你有一个类方法self.empty_bu
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).