2017-10-19 72 views
2

请帮助SQL查询。我有一个表:PL/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更新所有记录(通过模式分组)。因此,我必须用Ids更新记录(1,3,5)。带有ID(2,4)的记录在那里有PATTERN组中的最大值。

帮助PLZ

+0

什么值的更新语句你想更新吗? – L30n1d45

回答

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 
; 

你应该能够建立一个围绕,很容易够

+0

谢谢你的男人。我再一次看到'OVER(PARTITION BY pattern)'构造。也许你可以告诉我在哪里可以更好地学习它 - 我无法理解它:( – R1K0

+0

@ R1K0:只需搜索Oracle分析功能 - 那里有很多好东西 –

+0

和男人 - 那么'1 = 1'条件怎么样 - 或只是在使用可视化SQL后?:) – R1K0

0

事情是这样的:

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

目前还不清楚你想要什么设定值。 ????用于设置值的代码。

相关问题