SQL : Select 不同计数后的所有列 = 1
SQL : Select all column after a distinct count = 1
在 sql 中,我正在尝试这样做 :
我有一个(暂存)table 假设有 8 列
其中4列是主键table,我需要在其中插入暂存数据table
1列为列的操作(I为Insert,U为Update,D为Delete)
3个是数据
这意味着对于 main table 的 1 个主键,我可以在 staging one 中有多个列用于多个操作(例如,如果我有一个插入,然后一个更新)
我想做的是首先 select 所有主键所在的列,暂存中只有 1 条记录 table,然后 select一个是插入。我有那个:
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 次的键列表 table。
我现在想要的是来自这个列表,select 所有来自 staging where Operation='I'
的数据
类似这样的事情:
SELECT * FROM staging WHERE ([KEY1], [KEY2], [KEY3], [KEY4]) in #KEYTABLE AND [Operation]='I'
但我没有准确的语法来做这样的事情,最好的解决方案是什么?
我可以做一个 while 循环,但是对于大的 table 需要很多次(我首先尝试了这个解决方案,这意味着遍历暂存 table 的所有行并执行操作,但它需要很多次,所以尝试通过首先对在暂存中出现一次的行进行批量插入来优化操作,这是大部分行,因此它会改进很多过程)
谢谢
使用这个:
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
在 sql 中,我正在尝试这样做 :
我有一个(暂存)table 假设有 8 列
其中4列是主键table,我需要在其中插入暂存数据table
1列为列的操作(I为Insert,U为Update,D为Delete)
3个是数据
这意味着对于 main table 的 1 个主键,我可以在 staging one 中有多个列用于多个操作(例如,如果我有一个插入,然后一个更新)
我想做的是首先 select 所有主键所在的列,暂存中只有 1 条记录 table,然后 select一个是插入。我有那个:
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 次的键列表 table。 我现在想要的是来自这个列表,select 所有来自 staging where Operation='I'
的数据类似这样的事情:
SELECT * FROM staging WHERE ([KEY1], [KEY2], [KEY3], [KEY4]) in #KEYTABLE AND [Operation]='I'
但我没有准确的语法来做这样的事情,最好的解决方案是什么?
我可以做一个 while 循环,但是对于大的 table 需要很多次(我首先尝试了这个解决方案,这意味着遍历暂存 table 的所有行并执行操作,但它需要很多次,所以尝试通过首先对在暂存中出现一次的行进行批量插入来优化操作,这是大部分行,因此它会改进很多过程) 谢谢
使用这个:
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