我想知道是否有人可以帮助我。 我已经设法只插入不重复的行
NSERT INTO temp_Log
SELECT dq1.RowID,dq1.Action FROM DQLog dq1
WHERE dq1.RowID
NOT IN (SELECT RowID FROM DQLog dq2
group by dq2.RowID
having count(*)>1
我怎么还需要过滤重复的... 如何通过比较同一个表中重复行之间的值来选择行?
RowID Action
1 Reject
1 Allow
2 Allow
2 Fix
在这种情况下,我只需要插入第一行(reject + allow = Reject)和最后一行(Allow + Fix = Fix)。
谢谢大家的时间。
答案 0 :(得分:1)
我会这样说:
INSERT INTO temp_Log (?, ?) -- put the column names here
SELECT dq1.RowID,
(CASE WHEN MIN(dq1.Action) = MAX(d1.Action) THEN MIN(dq1.Action)
WHEN SUM(dq1.Action = 'Allow') > 0 AND SUM(dq1.Action = 'Reject') > 0 THEN 'Reject'
WHEN SUM(dq1.Action = 'Allow') > 0 AND SUM(dq1.Action = 'Fix') > 0 THEN 'Fix'
ELSE ?? -- your rules don't specify
END) as Action
FROM DQLog dq1
WHERE NOT EXISTS (SELECT 1
FROM DQLog d12
WHERE dq1.RowID = dq2.RowID
)
GROUP BY dq1.RowId;
注意:
ELSE ??
。NOT EXISTS
优于NOT IN
。首先,如果子查询中的一行是NOT IN
,NULL
将过滤掉所有行。其次,NOT EXISTS
应该比拥有聚合子查询更快。答案 1 :(得分:0)
如果Row_ID不可能多次允许作为操作,那么以下查询应该有效:
INSERT INTO temp_Log
(SELECT distinct RowID,Action
FROM DQLog
Where Action = 'Reject'
UNION ALL
SELECT distinct RowID,Action
FROM DQLog
Where Action = 'Fix'
And RowID not in (Select distinct RowID from DQLog where Action='Reject')
)
;
修改强>
我在评论中提到了两个选项。它是如何发展的:
选项1:
将Action列转换为小写值。
Update DQLog set Action = Lower(Action);
以上查询将以小写字母转换Action
的所有值。现在您可以运行以下查询并完成:
INSERT INTO temp_Log
(SELECT distinct RowID,Action
FROM DQLog
Where Action = 'reject'
UNION ALL
SELECT distinct RowID,Action
FROM DQLog
Where Action = 'fix'
And RowID not in (Select distinct RowID from DQLog where Action='reject')
)
;
因此,您的任务已完成,您的冗余数据也已修复。
Option 2:
只需在我的主查询的where子句中添加Fix
和Reject
的所有可能变体,如下所示:
INSERT INTO temp_Log
(SELECT distinct RowID,Action
FROM DQLog
Where Action = 'Reject' or Action='reject'
UNION ALL
SELECT distinct RowID,Action
FROM DQLog
Where Action = 'Fix' or Action = 'fix'
And RowID not in (Select distinct RowID from DQLog where Action='Reject'or Action='reject')
)
;
我建议你去Option 1
!
希望它有所帮助!