sql:选择不重复计数=1后的所有列

xam8gpfp  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(418)

在sql中,我尝试这样做:
我有一个(暂存)表,假设有8列
其中4列是主表的主键,我需要在其中插入暂存表的数据
1列是该列的操作(i表示插入,u表示更新,d表示删除)
三是数据
这意味着对于主表的一个主键,我可以在一个转移表中为多个操作设置多个列(例如,如果我有一个insert,那么就有一个update)
我要做的是首先选择所有列,其中对于主键,暂存表中只有一条记录,然后从中选择一条插入的记录。我有:

SELECT [KEY1], [KEY2], [KEY3], [KEY4], COUNT(1) AS [COUNT] 
INTO #COUNTTABLE
FROM staging
GROUP BY [KEY1], [KEY2], [KEY3], [KEY4]

SELECT [KEY1], [KEY2], [KEY3], [KEY4]
INTO #KEYTABLE
FROM #COUNTTABLE 
WHERE [COUNT]=1

这样,我就有了在我的暂存表中只出现1次的键列表。我现在想要的是从这个列表中,选择所有来自staging where operation='i'的数据
比如说:

SELECT * FROM staging WHERE ([KEY1], [KEY2], [KEY3], [KEY4]) in #KEYTABLE AND [Operation]='I'

但我没有确切的语法来做这样的事情,什么是最好的解决办法呢?
我可以做一个while循环,但是对于大表要做很多次(我已经先尝试了这个解决方案,意思是在staging表的所有行上循环并执行操作,但是要做很多次,所以尝试通过首先对staging中出现一次的行进行批量插入来优化操作,这是大多数的行,所以它将改善很多过程)谢谢

ijxebb2r

ijxebb2r1#

使用此选项:

with cte as (
select ROW_NUMBER() over (partition by [KEY1], [KEY2], [KEY3], [KEY4] order by [KEY1], [KEY2], [KEY3], [KEY4])rnum, * 
from staging )
select * from  cte s 
left join (select * from  cte  where rnum = 2)c on  s.[KEY1]=c.[KEY1] and  s.[KEY2]=c.[KEY2] and  s.[KEY3]=c.[KEY3] and  s.[KEY4] =c.[KEY4] 
where c.KEY1 is null

相关问题