更新 Select Into 表

问题描述 投票:0回答:1

我使用

从表“DIBBS.nsn”中制作了一个表“winner”
SELECT *
INTO "winner"
FROM 
    (SELECT  
         nsn_part_number, 
         reason, 
         ROW_NUMBER() OVER(PARTITION BY nsn_part_number ORDER BY date_accessed DESC) rn
     FROM 
         DIBBS_nsn
     WHERE
         order_status = 'WON') a
WHERE rn = 1

这需要所有“

nsn_part_number
”以及任何“WON”状态的原因。对于重复项,它需要最新日期的零件号和原因。

我正在尝试找出如何使用

DIBBS_nsn
来更新此表。
DIBBS_nsn
每天都会添加新行。

我尝试过的:

MERGE INTO winner AS target
USING dibbs_nsn AS source ON (target.nsn_part_number = source.nsn_part_number)
                          AND (source.order_status = 'WON')

WHEN NOT MATCHED
    THEN INSERT (nsn_part_number, reason)
         VALUES (source.nsn_part_number, source.reason)

此插入不会过滤掉任何重复项,这是有道理的,但不知道如何将其放入。

目前我的解决方法是删除表格并重新制作表格,然后使用更新来更新“获胜者”

DIBBS_nsn

我相信有一个查询需要更新,也许是更新插入?我调查了它,但有点困惑,因为我的选择只采用最新日期的零件号。

我需要什么:我可以运行的查询,每天在任务管理器中使用,在新行添加到

DIBBS_nsn
后更新“获胜者”表。

sql postgresql
1个回答
0
投票

不鼓励在 SQL 中使用

SELECT INTO
。请使用
CREATE TABLE AS
来代替。

CREATE TABLE winner AS  -- !
SELECT DISTINCT ON (nsn_part_number)  -- !
       nsn_part_number, reason
FROM   dibbs_nsn
WHERE  order_status = 'WON'
ORDER  BY nsn_part_number, date_accessed DESC;  -- !

参见:

表中没有包含多余的

rn

创建表后添加PK。每张桌子都应该有一个,我们下一步需要它:

ALTER TABLE winner ADD PRIMARY KEY (nsn_part_number);  -- !

您的每日(?)更新可以作为UPSERT

INSERT INTO winner (nsn_part_number, reason)
SELECT DISTINCT ON (nsn_part_number)
       nsn_part_number, reason
FROM   dibbs_nsn
WHERE  order_status = 'WON'
ORDER  BY nsn_part_number, date_accessed DESC
ON     CONFLICT (nsn_part_number) DO UPDATE  -- !
SET    reason = excluded.reason;  -- !

这对于每个

nsn_part_number
的几个合格行来说效果很好。对于很多人来说,其他查询技术要快得多。取决于未公开的信息。

参见:

© www.soinside.com 2019 - 2024. All rights reserved.