SQL:选择不同计数=1后的所有列
在sql中,我正在尝试这样做: 我有一个(暂存)表,假设有8列 其中4列是主表的主键,我需要在其中插入临时表的数据 1列是该列的操作(I表示插入,U表示更新,D表示删除) 三是数据 这意味着对于主表的1个主键,我可以在stagine one中为多个操作设置多个列(例如,如果我有一个insert,那么就有一个update) 我试图做的是首先选择所有列,其中对于主键,暂存表中只有一条记录,然后从中选择一条插入的记录。我有:SQL:选择不同计数=1后的所有列,sql,select,primary-key,Sql,Select,Primary Key,在sql中,我正在尝试这样做: 我有一个(暂存)表,假设有8列 其中4列是主表的主键,我需要在其中插入临时表的数据 1列是该列的操作(I表示插入,U表示更新,D表示删除) 三是数据 这意味着对于主表的1个主键,我可以在stagine one中为多个操作设置多个列(例如,如果我有一个insert,那么就有一个update) 我试图做的是首先选择所有列,其中对于主键,暂存表中只有一条记录,然后从中选择一条插入的记录。我有: SELECT [KEY1], [KEY2], [KEY3], [KEY4],
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的所有数据,其中Operation='I'
比如说:
SELECT * FROM staging WHERE ([KEY1], [KEY2], [KEY3], [KEY4]) in #KEYTABLE AND [Operation]='I'
但是我没有确切的语法来做这样的事情,最好的解决方案是什么
我可以做一个while循环,但对于大桌子来说需要很多次(我已经先尝试了这个解决方案,这意味着在暂存表的所有行上循环并执行操作,但这需要很多次,因此尝试通过首先执行暂存中出现一次的行的大容量插入来优化操作,这是大多数行,因此将大大改进流程)
谢谢你使用这个:
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
你用的是什么数据库管理系统?t-sql似乎和你想用的一样,mysql,postgres…他们中的大多数似乎都用这个关键词。我有,但我不明白它在这里怎么用?它只是一个“where”这可以使用函数对吗?have的问题是我无法选择所有列,因为3数据列没有使用聚合函数(例如,如果我选择[KEY1],…[KEY4],[DATA1],…[DATA3],则通过[KEY1],…[KEY4]have[COUNT]将(1)计数为Staging GROUP中的[COUNT]=1问题:选择列表,因为它不包含在聚合函数中