【问题标题】:PL/SQL update all records except with max valuePL/SQL 更新除最大值之外的所有记录
【发布时间】:2017-10-19 10:50:20
【问题描述】:

请帮助进行 SQL 查询。我有一张桌子:

CREATE TABLE PCDEVUSER.tabletest
(
    id INT PRIMARY KEY NOT NULL,
    name VARCHAR2(64),
    pattern INT DEFAULT 1 NOT NULL,
    tempval INT
);

让我们假设它充满了值:

INSERT INTO TABLETEST (ID, NAME, PATTERN, TEMPVAL) VALUES (1, 'A', 1, 10);
INSERT INTO TABLETEST (ID, NAME, PATTERN, TEMPVAL) VALUES (2, 'A', 1, 20);
INSERT INTO TABLETEST (ID, NAME, PATTERN, TEMPVAL) VALUES (3, 'A', 2, 10);
INSERT INTO TABLETEST (ID, NAME, PATTERN, TEMPVAL) VALUES (5, 'A', 2, 20);
INSERT INTO TABLETEST (ID, NAME, PATTERN, TEMPVAL) VALUES (4, 'A', 2, 30);

并且我需要使用 NO MAX 值 TEMPVALUE 更新所有记录(按模式分组)。因此,我必须使用 ID (1, 3, 5) 更新记录。 ID 为 (2, 4) 的记录在 PATTERN 组中具有最大值。

请帮忙

【问题讨论】:

  • 你想用什么值更新它们?

标签: sql plsql oracle11g


【解决方案1】:

此 select 语句将帮助您获得所需的 ID:

SELECT
 *
FROM
 (SELECT
   id
  ,name
  ,pattern
  ,tempval
  ,MAX(tempval) OVER (PARTITION BY pattern)  max_tempval
  FROM
   tabletest
 )
WHERE 1=1
AND tempval != max_tempval
;

你应该能够很容易地围绕它构建一个更新语句

【讨论】:

  • 谢谢你。又一次我看到了“OVER(PARTITION BY 模式)”结构。也许你可以告诉我在哪里学得更好——我听不懂:(
  • @R1K0 :只需搜索 Oracle 分析函数 - 那里有很多好东西。
  • 还有人 - '1=1' 条件怎么样 - 或者它只是在使用可视 SQL 之后? :)
  • 这只是习惯——我总是把那个条件放进去。这是因为我经常想在 where 子句中注释掉行。如果第一行 (WHERE...) 有意义,那么如果您想将其注释掉,则需要将 WHERE 语句移至下一行。如果第一行是 WHERE 1=1 我知道我永远不想评论那一行。
  • 好主意。开始使用吧:)
【解决方案2】:

类似这样的:

update tabletest t
    set ????
    where t.tempval < (select max(tempval) from tabletest tt where tt.pattern = t.pattern);

尚不清楚您要设置什么值。 ???? 用于设置值的代码。

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多