SQL 查询,GROUP/COUNT INNER JOIN 问题

SQL Query, GROUP/COUNT issue with INNER JOIN

我有一个主要由日期、ID 和地址组成的数据集,看起来有点像这样:

datadate   id      address
20150801    Bob     123
20150801    Bob     123
20150801    Dan     345
20150801    Dan     456
20150801    Dan     567
20150801    George  234
20150801    Jim     123
20150801    Jim     123
20150801    John    678
20150801    John    123
20150802    Tom     123
20150802    Tom     234
20150802    Tom     345

我的目标是编写一个查询,以识别与特定日期(或日期范围)的多个不同地址关联的任何 ID。我希望查询结果给我姓名和不同的地址。因此,对于此数据集,我希望看到的结果如下所示,日期为 8/1/2015:

datadate   id      address
20150801    Dan     345
20150801    Dan     456
20150801    Dan     567
20150801    John    678
20150801    John    123

到目前为止,我的查询是这样的,但它对我来说并不适用:

SELECT a.[datadate], a.[id], a.[address], b.[count1]
FROM table1 AS a INNER JOIN (SELECT [id], COUNT([address]) as [count1]   FROM table1   GROUP BY [id]   having count1 > 1   )  AS b ON a.[id]=b.[id]
WHERE a.[datadate] = '20150801'
ORDER BY a.[id], a.[address];

有什么建议吗?

编辑

我刚刚又看了一遍你的问题,你似乎想要所有重复的问题。在这种情况下,我会使用 exists 来查看是否存在具有相同 ID 但不同地址的另一行。

select * from mytable t1
where datadate = '20150801'
and exists (
    select 1 from mytable t2
    where t2.id = t1.id
    and t2.address <> t1.address
    and t2.datadate = t1.datadate
)

只需稍微修改您现有的查询,您就可以更改为 count(distinct address),然后重新加入 table 以获得您的地址值,如下所示:

SELECT t.datadate
      ,t.id
      ,t1.address
FROM (
    SELECT datadate
        ,id
        ,count(DISTINCT address) address
    FROM test
    WHERE datadate = '20150801'
    GROUP BY datadate,id
    HAVING count(DISTINCT address) > 1
    ) t
INNER JOIN test t1 ON t.datadate = t1.datadate
    AND t.id = t1.id;

我在 SQL Server 上测试过这个,但在 MS-Access 上也应该类似。

SQL Fiddle Demo