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

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

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

  1. SELECT [KEY1], [KEY2], [KEY3], [KEY4], COUNT(1) AS [COUNT]
  2. INTO #COUNTTABLE
  3. FROM staging
  4. GROUP BY [KEY1], [KEY2], [KEY3], [KEY4]
  5. SELECT [KEY1], [KEY2], [KEY3], [KEY4]
  6. INTO #KEYTABLE
  7. FROM #COUNTTABLE
  8. WHERE [COUNT]=1

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

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

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

ijxebb2r

ijxebb2r1#

使用此选项:

  1. with cte as (
  2. select ROW_NUMBER() over (partition by [KEY1], [KEY2], [KEY3], [KEY4] order by [KEY1], [KEY2], [KEY3], [KEY4])rnum, *
  3. from staging )
  4. select * from cte s
  5. 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]
  6. where c.KEY1 is null

相关问题