有2个表,一个叫AI,一个叫Ai_sig 
AI包括SID,TIME 等等栏位 
在Ai_sig中value是主键 
Ai_sig中包括value和AttackName栏位
语句如下
SELECT TOP 10 AI.SID,min(Ai_sig.AttackName) AS Name,COUNT(AI.SID) AS NUM FROM AI LEFT JOIN Ai_sig ON AI.SID=Ai_sig.value GROUP BY AI.SID ORDER BY COUNT(AI.SID) DESC当该表中只有一条数据时,COUNT(AI.SID) AS NUM的值应该为1,但是得到的结果是2
我试着加入了几条SID相同的数据,发现搜索的出的结果也是期待结果的2倍。
请问这是为什么?
用SELECT COUNT(Index) AS SUM FROM AI 结果是正常的。另外,和这个非常相同的一条语句:
SELECT TOP 10 AV.SID,min(Klav_sig.VirusName) AS Name,COUNT(AV.SID) AS NUM FROM AV LEFT JOIN Klav_sig ON AV.SID=Klav_sig.value GROUP BY AV.SID ORDER BY COUNT(AV.SID) DESC
得到的NUM值就是1倍,即正确的结果。谁能告诉我该如何改吗?
谢谢!

解决方案 »

  1.   

    原因很简单.
    access 使用jetsql,mssql使用t-sql
    二者的top n有区别.
    设有表 tb(id int)
    1
    1
    1
    2
    2
    3
    3
    t-sql的 top n ,指无论数据如何, 只按排序列取n条,即一行做一次计数
    select top 2 * from tb order by id
    结果两行
    1
    1
    jetsql的top n,重复行做为一次top计数
    select top 2 * from tb order by id
    结果不定,如果数据表中至少有2行记录,那么结果至少是2行,也即选出的结果>=n
    1
    1
    1
    2
    2
    2
    你的第一条语句,虽然第一个表sid只一条记录,但连表时,可能会一对多,形成多条记录,
    比如 ta (sid int counter) tb(id int)
    ta 有
    1
    2
    tb有
    1
    1
    2
    连表后,sid=1的会出现两条我看了你的第二条语句,因为用的连表的表名不一样,可能是一对一,所以count是正常的.还是一句话, jetsql的top n依赖排序字段的值, 而不光依赖于n
      

  2.   

    SELECT AI.SID, ..., COUNT(AI.SID) FROM ... GROUP BY AI.SID
    逻辑上就不通。