当前位置: 首页 > 面试题库 >

用ORDER BY更新

狄宗清
2023-03-14
问题内容

需要“配合”UPDATEORDER BY。我正在尝试使用游标,但出现错误:

cursor "cursupd" doesn't specify a line,
SQL state: 24000

代码:

BEGIN;
    DECLARE cursUpd CURSOR FOR SELECT * FROM "table" WHERE "field" = 5760 AND "sequence" >= 0 AND "sequence" < 9 ORDER BY "sequence" DESC;
    UPDATE "table" SET "sequence" = "sequence" + 2 WHERE CURRENT OF cursUpd;
    CLOSE cursUpd;
COMMIT;

如何正确做?

更新1

没有光标时,我这样做:

UPDATE "CableLinePoint" AS "t"
SET "sequence" = t."sequence" + 2
from (
    select max("sequence") "sequence", "id"
    from "CableLinePoint"
    where
        "CableLine" = 5760
    group by "id"
    ORDER BY "sequence" DESC
) "s"
where "t"."id" = "s"."id" and "t"."sequence" = "s"."sequence"

我得到了唯一的错误。因此,需要从头开始而不是从头开始更新。

更新2

桌子:

id|CableLine|sequence
10|    2    |    1
11|    2    |    2
12|    2    |    3
13|    2    |    4
14|    2    |    5

需要更新(增加)字段“顺序”。“序列”具有“索引”类型,因此无法完成:

UPDATE "table" SET "sequence" = "sequence" + 1 WHERE "CableLine" = 2

当行中的“序列”id = 10增加1时,1我收到一条错误,指出"sequence" = 2已存在另一行。


问题答案:

UPDATEORDER BY

至于所提问题的标题:ORDER BYSQLUPDATE命令中没有。Postgres以任意顺序更新行。但是,您有(有限的)选项来决定是在每行之后,每条语句之后还是在事务结束时检查约束。您可以避免带有约束的
中间 状态重复键冲突DEFERRABLE

我引用了我们在此问题下得出的结论:

  • NOT DEFERRED 在每行之后 检查约束。

  • DEFERRABLE 在每个语句之后* 检查设置为IMMEDIATEINITIALLY IMMEDIATE或通过SET CONSTRAINTS)的约束。 *

但是有局限性。外键约束要求在目标列上具有 不可延迟的 约束。

引用的列必须是引用表中不可延迟的唯一或主键约束的列。

解决方法

问题更新后更新。
假设"sequence"在正常操作中从不为负,则可以避免出现以下独特错误:

UPDATE tbl SET "sequence" = ("sequence" + 1) * -1
WHERE  "CableLine" = 2;

UPDATE tbl SET "sequence" = "sequence" * -1
WHERE  "CableLine" = 2
AND    "sequence" < 0;

使用不可延迟约束(默认),您必须运行两个单独的命令才能使此工作生效。快速连续运行命令以避免并发问题。该解决方案显然不适用于繁重的并发负载。

另外:
可以跳过AS表别名的关键字,但不建议对列别名执行相同的操作。

我建议不要使用SQL关键字作为标识符,即使允许这样做。

避免问题

在更大的规模上或对于具有较大并发负载的数据库,使用serial列进行行的相对排序比较明智。您可以row_number()在视图或查询中使用窗口函数生成以1开头且没有空格的数字。考虑以下相关答案:

您应该重新考虑您的方法。您的表格只需一个简单的序列,然后将其结合起来user_id即可获得所需的排序顺序。

您始终可以使用row_number()简单的查询(例如:)来生成具有所需数字的自定义网址:

SELECT format('domain.me/username_%s/posts/%s'
              ,user_id
              ,row_number() OVER (PARTITION BY user_id ORDER BY seq_id)
             )
FROM   t;


 类似资料:
  • 问题内容: 我正在使用angular-filter中的 groupBy 按对象的date属性对对象数组进行分组。 产生以下内容: 如何从最近的日期开始颠倒顺序?当我打印到控制台时,以我想要的顺序打印阵列: 我还编写了一个自定义过滤器来反转groupBy之后的顺序: 我已经这样申请了: 问题答案: 最近有同样的问题。创建一个对象,但需要一个数组,因此涉及一些时髦。我最终从他们的问题页面直接得到了答案

  • 问题内容: 我有一堂课说:“ ClassA”,其中包含“ ClassB”的集合 “ ClassB”具有使用普通旧映射注释的映射类“ ClassC”: 如何将@OrderBy批注添加到ClassA的ClassB的集合中,以便按ClassC的“名称”属性对集合进行排序 像这样: 我得到的都是Oracle异常,它说classC是未知的。 这里的任何帮助都将非常棒,因为此刻确实困扰着我。 PS我还应该提到

  • 我尝试使用多个自定义字段显示结果,同时按第一个自定义字段(startdate)排序结果。我看到的建议让我尝试了以下方法: 问题是,如果没有meta_key参数,结果会默认过滤帖子的日期。当我添加meta_key参数对结果进行排序时,我得到的每一篇文章都有一个meta_key等于开始日期。通过添加这些meta_key参数,语句似乎完全忽略了meta_query数组中的条件。我如何让查询排序的开始日期

  • 我有一个代码是这样的: } 有人知道为什么查询不能使用Order By time_end ASC吗???我尝试了并得到了相同的结果

  • 从的lodash文档中: 将集合减少为一个值,该值是通过iteratee运行集合中每个元素的累积结果,其中每个后续调用都提供了前一个元素的返回值。如果未给出累加器,则使用集合的第一个元素作为初始值。iteratee由四个参数调用:(累加器、值、索引|键、集合)。 许多lodash方法被保护为像x这样的方法的迭代对象。减少。右减速器,和。使改变 受保护的方法有:assign、defaults、def

  • 我有值和像0,1,然后我将使用降序获取数据使用以下查询。 但它只按降序显示。如果我使用另一个查询,如: 它只显示特色结果。我需要所有的广告帖子,按照

  • JPA为什么OrderBy应用于Set? https://docs.oracle.com/javaee/7/api/javax/persistence/OrderBy.html 该集合应该是未排序的。使用 Set 类型对属性@OrderBy进行注释是否有意义?

  • 问题内容: 我正在尝试获得最受欢迎的黑客马拉松,这需要通过各自的黑客马拉松订购。抱歉,这有点难以理解。 我有以下格式的数据库: 该模型是: 并定义为: 我已经尝试过,但是我觉得我犯了一个大错误(可能是$ this-> id),因为它根本不起作用。 我将如何尝试获取基于最多的相关hackathon参与者的最受欢迎的hackathon? 问题答案: 编辑:如果使用Laravel 5.2或更高版本,请使