仅返回Access SQL中的重复值

时间:2017-11-06 03:39:27

标签: sql ms-access

我在尝试仅在Microsoft Access上的查询中返回重复值时遇到问题。

这是我的初步查询:

SELECT tbl_dbextract_GP.GPNo, 
    [tbl_dbextract_GP].[GPFirst]+" "+[tbl_dbextract_GP].[GPLast] AS GPName, 
    Sum(tbl_main_ListLog.count_ToImport) AS ImportCount, 
    tbl_main_ListLog.SearchSequence
FROM ((tbl_main_ListLog
INNER JOIN tbl_dbextract_GPPractice 
    ON tbl_main_ListLog.GPPracticeID = tbl_dbextract_GPPractice.Id) 
INNER JOIN tbl_dbextract_GP 
    ON tbl_dbextract_GPPractice.GPId = tbl_dbextract_GP.Id)
WHERE tbl_dbextract_GP.GPNo <> 'G0000'
GROUP BY tbl_dbextract_GP.GPNo, 
    [tbl_dbextract_GP].[GPFirst]+" "+[tbl_dbextract_GP].[GPLast], 
    tbl_main_ListLog.SearchSequence;

我只想返回每个GPNo至少有2个条目的结果。 搜索序列是递增的,所以基本上我试图找到至少有2次搜索的条目。

这是我的尝试:

SELECT
    tbl_dbextract_GP.GPNo,
    [tbl_dbextract_GP].[GPFirst] + " " + [tbl_dbextract_GP].[GPLast] AS GPName,
    Sum(tbl_main_ListLog.count_ToImport) AS ImportCount,
    tbl_main_ListLog.SearchSequence
FROM (((tbl_main_ListLog
INNER JOIN tbl_dbextract_GPPractice 
    ON tbl_main_ListLog.GPPracticeID = tbl_dbextract_GPPractice.Id) 
INNER JOIN tbl_dbextract_GP 
    ON tbl_dbextract_GPPractice.GPId = tbl_dbextract_GP.Id)
LEFT JOIN (
    SELECT tbl_main_ListLog.GPPracticeID as GPPID, 
        SUM(tbl_main_ListLog.SearchSequence) as SumSS
    FROM tbl_main_ListLog
    WHERE SumSS > 1
    GROUP BY tbl_main_ListLog.GPPracticeID) SubQ 
ON tbl_main_ListLog.GPPracticeID = SubQ.GPPID)
WHERE tbl_dbextract_GP.GPNo <> 'G0000'
GROUP BY tbl_dbextract_GP.GPNo, 
[tbl_dbextract_GP].[GPFirst]+" "+[tbl_dbextract_GP].[GPLast], 
tbl_main_ListLog.SearchSequence;

这不起作用,因为它促使我​​在执行时手动输入SumSS的值,并且无论如何都没有返回正确的结果。

这是一个示例输出(名称已编辑) - 我想返回每个GPNo至少有2个条目的结果

This is a sample output (Names redacted) - I want to return results where there is at least 2 entries per GPNo

编辑:使用Tim的解决方案修改了尝试 - 返回“JOIN操作中的语法错误”:

SELECT
    t3.GPNo, 
    t3.GPFirst + " " + t3.GPLast AS GPName,
    SUM(t1.count_ToImport) AS ImportCount, 
    t1.SearchSequence
FROM (((tbl_main_ListLog t1
INNER JOIN tbl_dbextract_GPPractice t2 
    ON t1.GPPracticeID = t2.Id)
INNER JOIN tbl_dbextract_GP t3 
    ON t2.GPId = t3.Id)
INNER JOIN
(
    SELECT t3.GPNo
    FROM ((tbl_main_ListLog t1
    INNER JOIN tbl_dbextract_GPPractice t2
        ON t1.GPPracticeID = t2.Id)
    INNER JOIN tbl_dbextract_GP t3
        ON t2.GPId = g3.Id)
    GROUP BY t3.GPNo
    HAVING COUNT(*) > 1
) t4
    ON t3.GPNo = t4.GPNo)
WHERE
    t3.GPNo <> 'G0000'
GROUP BY
    t3.GPNo, 
    t3.GPFirst + " " + t3.GPLast, 
    t1.SearchSequence;

2 个答案:

答案 0 :(得分:1)

鉴于这是MS Access,它不支持分析函数,对另一个子查询进行连接以对搜索次数施加限制似乎是一种合理的方法,并且您的第二次尝试看起来并不遥远。但您应该使用HAVING运算符代替WHERE,并进行一些其他更改:

SELECT
    t3.GPNo, 
    t3.GPFirst + " " + t3.GPLast AS GPName,
    SUM(t1.count_ToImport) AS ImportCount, 
    t1.SearchSequence
FROM tbl_main_ListLog t1
INNER JOIN tbl_dbextract_GPPractice t2 
    ON t1.GPPracticeID = t2.Id
INNER JOIN tbl_dbextract_GP t3 
    ON t2.GPId = t3.Id
INNER JOIN
(
    SELECT t3.GPNo
    FROM tbl_main_ListLog t1
    INNER JOIN tbl_dbextract_GPPractice t2
        ON t1.GPPracticeID = t2.Id
    INNER JOIN tbl_dbextract_GP t3
        ON t2.GPId = t3.Id
    GROUP BY t3.GPNo
    HAVING COUNT(*) > 1
) t4
    ON t3.GPNo = t4.GPNo
WHERE
    t3.GPNo <> 'G0000'
GROUP BY
    t3.GPNo, 
    t3.GPFirst + " " + t3.GPLast, 
    t1.SearchSequence;

在我将其作为t4别名的子查询中,我使用与原始查询相同的连接集,但我只能通过GPNo进行聚合。另外,我添加了一个HAVING子句,要求GPNo出现两次或更多次才能保留在结果集中。然后,此子查询过滤掉原始查询中的非匹配GPNo记录。

答案 1 :(得分:0)

Count(1) As Countr添加到您的查询中并应用条件Countr>1(如上所述应用HAVING子句。

或者,为了简化您的任务,您可以将原始工作查询保存为中间工作查询,例如Sub_With_Duplicates(Access具有该功能),然后在中间版本的顶部构建另一个(例如Qry_No_Duplicates,并简单地将WHERE Countr>1子句应用于该字段。应该工作。