如何在sql查询中嵌套计数

如何在sql查询中嵌套计数,sql,Sql,我有以下两个问题 第一个列表列出了用户和上次登录日期,如下所示: iUserNum chDefaultLogin dateLastLogin -------- -------------- ------------- 17 fred.bloggs 01/06/2011 23 john.doe 13/05/2011 iUserNum chDefaultLogin dateLastLogin loginCount --------

我有以下两个问题

第一个列表列出了用户和上次登录日期,如下所示:

iUserNum  chDefaultLogin  dateLastLogin
--------  --------------  -------------
17        fred.bloggs     01/06/2011
23        john.doe        13/05/2011
iUserNum  chDefaultLogin  dateLastLogin  loginCount
--------  --------------  -------------  ----------
17        fred.bloggs     01/06/2011     12
23        john.doe        13/05/2011     4
使用以下查询

SELECT SDToken.iUserNum, chDefaultLogin, dateLastLogin
FROM SDUserScope JOIN SDToken ON SDUserScope.iUserNum = SDToken.iUserNum
第二个查询给出了用户在过去7天内使用此查询登录的次数(给定iUserNum用户编号)(在下面的示例中,我给出了iUserNum 17):

我要做的是将这两者连接在一起,因此我得到表中每个用户的计数,如下所示:

iUserNum  chDefaultLogin  dateLastLogin
--------  --------------  -------------
17        fred.bloggs     01/06/2011
23        john.doe        13/05/2011
iUserNum  chDefaultLogin  dateLastLogin  loginCount
--------  --------------  -------------  ----------
17        fred.bloggs     01/06/2011     12
23        john.doe        13/05/2011     4

在MS Sql server/SYBASE中,将用户名作为公共密钥连接的2个子查询应该可以完成这项工作,如下所示,但任何其他RDBMS都可以使用2个子查询应用相同的逻辑…语法可能会有所不同

Select A.SDToken.iUserNem, A.chDefaultLogin, A.dateLastLoginm,B.logincount
    FROM 
    (
        (SELECT SDToken.iUserNem, chDefaultLogin, dateLastLogin FROM SDUserScope JOIN SDToken ON SDUserScope.iUserNum = SDToken.iUserNum )A
        INNER JOIN 
        (SELECT COUNT(*)logincount,SDToken.iUserNem FROM SDToken    
         JOIN SDLogEntry ON SDLogEntry.chTokenSerialNum = SDToken.chSerialNum    
         JOIN SDUserScope ON SDToken.iUserNum = SDUserScope.iUserNum    
         JOIN SDLogMessage ON SDLogEntry.iMessageNum = SDLogMessage.iMessageNum    
         WHERE SDToken.iUserNum = 17 AND SDUserScope.iSiteNum = iMySite AND SDLogEntry.dtGMTDate > GMTDateNow - 7 
         GROUP BY SDToken.iUserNem)B
         ON A.iUserNem = B.iUserNem
    )

在MS Sql server/SYBASE中,将用户名作为公共密钥连接的2个子查询应该可以完成这项工作,如下所示,但任何其他RDBMS都可以使用2个子查询应用相同的逻辑…语法可能会有所不同

Select A.SDToken.iUserNem, A.chDefaultLogin, A.dateLastLoginm,B.logincount
    FROM 
    (
        (SELECT SDToken.iUserNem, chDefaultLogin, dateLastLogin FROM SDUserScope JOIN SDToken ON SDUserScope.iUserNum = SDToken.iUserNum )A
        INNER JOIN 
        (SELECT COUNT(*)logincount,SDToken.iUserNem FROM SDToken    
         JOIN SDLogEntry ON SDLogEntry.chTokenSerialNum = SDToken.chSerialNum    
         JOIN SDUserScope ON SDToken.iUserNum = SDUserScope.iUserNum    
         JOIN SDLogMessage ON SDLogEntry.iMessageNum = SDLogMessage.iMessageNum    
         WHERE SDToken.iUserNum = 17 AND SDUserScope.iSiteNum = iMySite AND SDLogEntry.dtGMTDate > GMTDateNow - 7 
         GROUP BY SDToken.iUserNem)B
         ON A.iUserNem = B.iUserNem
    )

您是否尝试统一查询并仅添加分组依据

SELECT  SDToken.iUserNum, 
        chDefaultLogin, 
        dateLastLogin,
        COUNT(*) AS loginCount
FROM SDUserScope 
    INNER JOIN SDToken 
        ON SDUserScope.iUserNum = SDToken.iUserNum
            INNER JOIN SDLogEntry 
                ON SDLogEntry.chTokenSerialNum = SDToken.chSerialNum 
                    INNER JOIN SDLogMessage 
                        ON SDLogEntry.iMessageNum = SDLogMessage.iMessageNum 
WHERE   SDToken.iUserNum = 17 
AND     SDUserScope.iSiteNum = iMySite 
AND     SDLogEntry.dtGMTDate > GMTDateNow - 7
GROUP BY    SDToken.iUserNum, 
            chDefaultLogin, 
            dateLastLogin

您是否尝试统一查询并仅添加分组依据

SELECT  SDToken.iUserNum, 
        chDefaultLogin, 
        dateLastLogin,
        COUNT(*) AS loginCount
FROM SDUserScope 
    INNER JOIN SDToken 
        ON SDUserScope.iUserNum = SDToken.iUserNum
            INNER JOIN SDLogEntry 
                ON SDLogEntry.chTokenSerialNum = SDToken.chSerialNum 
                    INNER JOIN SDLogMessage 
                        ON SDLogEntry.iMessageNum = SDLogMessage.iMessageNum 
WHERE   SDToken.iUserNum = 17 
AND     SDUserScope.iSiteNum = iMySite 
AND     SDLogEntry.dtGMTDate > GMTDateNow - 7
GROUP BY    SDToken.iUserNum, 
            chDefaultLogin, 
            dateLastLogin

不幸的是,我在这里飞行有点盲目。这是在一个应用服务器(RSA)上,它有一个基本的查询编辑器来输入查询,但我不知道它在幕后运行的是什么。pl SQL、T-SQL和MySQl的不同之处在于,我认为它基于MS SQL,可能是SQL Express。(如果有帮助的话,肯定不是mySQL!)显然是:“RSA ACE/Server在关系数据库管理系统(RDBMS)中维护其数据。”不幸的是,我在这里有点盲目。这是在一个应用服务器(RSA)上,它有一个基本的查询编辑器来输入查询,但我不知道它在幕后运行的是什么。pl SQL、T-SQL和MySQl的不同之处在于,我认为它基于MS SQL,可能是SQL Express。(如果有帮助的话,肯定不是mySQL!)显然是:“RSA ACE/Server将其数据维护在一个Progress relational database management system(RDBMS)中。”“我认为这是99%——但是,我希望第二个查询中的iUserNum(当前设置为17)与该行用户的iUserNum匹配。这可能吗?等一下,我只是麻木了吗?我想我只需要从WHERE子句中删除SDToken.iUserNum行……您希望结果表中包含登录计数为零的用户吗?@Ben:我想您是对的,
iUserNum
上的过滤器应该被删除。@Walter Mitty-是的,我需要。我需要更改联接吗?我想这是99%——但是,我希望第二个查询中的iUserNum(当前设置为17)与该行上用户的iUserNum匹配。这可能吗?等一下,我只是麻木了吗?我想我只需要从WHERE子句中删除SDToken.iUserNum行……您希望结果表中包含登录计数为零的用户吗?@Ben:我想您是对的,
iUserNum
上的过滤器应该被删除。@Walter Mitty-是的,我需要。我需要更改连接吗?