如何执行返回多个列的独特查询

时间:2012-07-19 13:32:48

标签: ms-access

我需要创建一个MS Access查询,该查询只返回序列号的一个实例以及其他一些列。例如

SerialNumber    CRM        EmailClient   VersionBuild  IPAddress  DateLogged
------------    ----       -----------   ------------  ---------  ----------
123456          Outlook    Outlook       4.7.4         0.0.0.0    20120625
123456          SugarCRM   SMTP          4.6.1         0.0.0.0    20120621
435352          ACT!       Outlook       4.5.2         0.0.0.0    20120619
537352          ACT!       SMTP          4.5.3         0.0.0.0    20120619

结果将是

SerialNumber    CRM        EmailClient   VersionBuild  IPAddress  DateLogged
------------    ----       -----------   ------------  ---------  ----------
123456          Outlook    Outlook       4.7.4         0.0.0.0    20120625
435352          ACT!       Outlook       4.5.2         0.0.0.0    20120619
537352          ACT!       SMTP          4.5.3         0.0.0.0    20120619

我试图使用以下查询来完成此操作。我认为First和Group取消了对方。

SELECT FIRST(LogData.SerialNumber), LogData.CRM, LogData.EmailClient, LogData.VersionBuild, LogData.IPAddress, LogData.DateLogged
FROM LogData
GROUP BY  LogData.CRM, LogData.EmailClient, LogData.VersionBuild, LogData.IPAddress, LogData.DateLogged

3 个答案:

答案 0 :(得分:1)

在评论中,您提到LogData没有主键。如果添加自动编号主键,则问题变得非常容易解决。

使用子查询为每个id组返回单个SerialNumber值,并将子查询INNER JOIN返回到LogData

SELECT base.*
FROM
    LogData AS base
    INNER JOIN (
        SELECT SerialNumber, Min(id) AS which_id
        FROM LogData
        GROUP BY SerialNumber
    ) AS sub
    ON base.id = sub.which_id;

base.*替换为您要显示的字段列表。

答案 1 :(得分:0)

我想你想这样做:

  • 只获得一个SerialNumber => GROUP BY SerialNumber
  • 每个SerialNumber只有一个(第一个)名称=> FIRST(LogData.First)
SELECT LogData.SerialNumber, FIRST(LogData.First), FIRST(LogData.Last)
FROM LogData
GROUP BY  LogData.SerialNumber

但是要注意:这可能会导致(不是“FIRST”功能)的混合记录,如:

Serial    First    Last
------    -----    ----
123456    Frank    Smith

顺便说一下:所有SQL系统都不支持“FIRST”-Grouping-Function: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html您可以使用其他函数来实现sql标准...

答案 2 :(得分:0)

这不是很漂亮但是......

SELECT L.SerialNumber, 
            (Select Top 1 A.First from LogData as A where A.SerialNumber = L.SerialNumber Order by A.First, A.Last) AS [First], 
            (Select Top 1 A.Last from LogData as A where A.SerialNumber = L.SerialNumber Order by A.First, A.Last) AS [Last]
FROM LogData AS L
GROUP BY L.SerialNumber;

这基本上是托马斯的答案,除了因为你使用子查询,你可以通过命令来确保你总是得到预期的结果。