现在,我使用copy
命令加载数据,并发出queryselect*from emp order by empno
,但我感到惊讶的是,CQL不允许order by onempno
列(即PK)。另外,当我使用where
条件时,它不允许对empno列进行任何不等式操作(它说只允许EQ或IN条件)。它也不允许在任何其他列上使用Where和Order by,因为它们在PK中没有使用,也没有索引。
如果我想保持empno
在表中唯一,并希望查询结果按照empno
排序,有人能帮助我吗?
(我的版本是:
Cassandra中的主键有两个部分:
主键(partitionKey1、clusteringKey1、clusteringKey2)
Cassandra通过使用集群键对磁盘上的数据进行排序来实现性能,从而只在一次读取中返回有序的行(没有随机读取)。这就是为什么您必须使用Cassandra采用基于查询的建模方法(通常将数据复制到多个查询表中)。提前了解您的查询,并建立您的表来为它们服务。
Select * from emp order by empno;
首先,您需要一个WHERE
子句。如果您使用的是关系数据库,那么在没有它的情况下进行查询是可以的。对于Cassandra,您应该尽力避免未绑定的select
查询。此外,Cassandra只能在分区内强制排序顺序,因此如果不使用WHERE
子句进行查询,无论如何都不会按照您希望的顺序返回数据。
其次,正如我上面提到的,您需要定义聚类键。如果希望按empno
对结果集进行排序,则必须找到另一列定义为分区键。尝试如下所示:
CREATE TABLE emp_by_dept (
empno text,
dept text,
name text,
PRIMARY KEY (dept,empno)
) WITH CLUSTERING ORDER BY (empno ASC);
SELECT * FROM emp_by_dept WHERE dept='IT';
我很抱歉自我推销,但去年我为DataStax写了一篇文章,名为We Wall Have Order!,其中我讨论了如何解决这些类型的问题。给它读一读,看看有没有帮助。
编辑以了解其他问题:
从你的回答中,我总结了关于卡桑德拉的两件事:
我在“emp”表的“empno”列上创建了一个索引,但它仍然不允许按empno排序。那么,索引是用来做什么的呢?它们只用于搜索索引键的特定值吗?
不能按索引列排序结果集。二级索引(与它们的关系对应项不同)实际上只对边缘情况、基于分析的查询有用。它们不缩放,因此一般建议不要使用二级索引。
好的,这仅仅意味着一个表不能用于获得不同条件和不同排序顺序的不同结果集。
嗨,亚伦,你在上面说“不是说ORDER BY是没用的,我想说它唯一真正的用途是在ASC和DESC之间切换你的排序方向。”
但我发现这是不正确的。Cassandra只允许ORDER by的方向与我们在CREATE TABLE的“集群ORDER by”caluse中定义的方向相同。如果我们在该子句中定义ASC,它只允许按ASC排序,反之亦然。
如果没有看到错误消息,就很难知道该告诉您什么。虽然我听说过当分区中存储了太多行时,order by
的查询会失败。
InvalidRequest: code=2200 [Invalid query] message="Unsupported order by relation"
问题内容: 我有下面的SQLite表,其中包含198,305个地理编码的葡萄牙邮政编码: 我在PHP中还具有以下用户定义的函数,该函数返回两个坐标之间的距离: 只有 874个 记录的距离小于或等于1 km。 问题 UDF在SQL查询中可以完美地工作,但是由于某些原因,我不能在子句中使用它的返回值-例如,如果我执行查询: 它返回1035条记录, _ 排序时间约为0.05秒, _但是 最后一条记录的距
问题内容: 我最近才刚开始使用SQLAlchemy,但仍无法解决某些概念。 归结为基本元素,我有两个这样的表(通过Flask-SQLAlchemy): 我将如何查询用户列表及其最新帖子(不包括无帖子的用户)。如果我使用的是SQL,则可以执行以下操作: 因此,我确切地知道“期望的” SQL可以达到我想要的效果,但是不知道如何在SQLAlchemy中“正确地”表达它。 编辑:如果很重要,我使用的是SQ
问题内容: 我有一个这样的表“ bla”: 如果我做SQL查询 我只得到ID为2的记录。我没有ID为3的记录,其中fk为空。我以为NULL!=4。看来这是错误的。 为什么会这样呢? 问题答案: 不等于任何东西。您需要明确接受null: 有关处理的更多信息,请参见使用NULL。
问题内容: 如果列匹配,是否有很好的方法在SQL中表示选择特定的行,否则选择更通用的行?就像是: 我只希望它返回一个特定的记录(如果存在),否则,如果找不到特定的列匹配项,则返回通用的“ ALL”记录。看起来COALESCE与我正在寻找的相似,但我不知道在语法上如何工作。 问题答案: @Blorgbeard答案(使用前1个和排序依据)可能是最好的方法,但只是有所不同,您还可以使用子查询,但不存在:
问题内容: 我的网页上有一个绑定到gridview的entitydatasource。 在后面的代码中,我可以使用entitydatasource的WHERE语句过滤并向网格视图显示所需的内容。我的where语句之一使用大的OR语句进行过滤,但是逻辑上比较多的IN语句不起作用。 例如,我有雇员1-9,并且我想选择雇员1、4和7。在SQL中,我可以通过以下两种方式: 1。 2。 这两个语句在SQL中
我是JPA的新手。使用where子句构建select查询。我需要从表Contacts中选择所有等于字符串名称值的ContactName。 以下是执行我的项目时出现的错误:java.lang.IllegalArgumentException:无法根据在org.hibernate.jpa.criteria.path.abstractPathimpl.unknownatAttribute(abstrac