如何对多列显示多次的行的所有列

时间:2019-07-11 20:44:49

标签: sql ms-access

我只有一张桌子 我需要返回行中所有4列被多次查看的行的所有列。

我有一个大表,其中的数据具有唯一的ID,可能会重复出现几列,然后在获得数据的那一年是2018年或2019年:

ID - Name - ZIP - Phone - Year Recorded 
4234 | John | 56473 | 555-555-555 | 2018
4234 | Tod  | 73746 | 556-556-556 | 2018
4235 | John | 56473 | 555-555-555 | 2019
4236 | Mary | 47384 | 577-577-577 | 2019

我想从[表格]中选择*,其中重复输入姓名,邮政编码,电话,年份为2019:

4235 | John | 56473 | 555-555-555 | 2019

我已经使用以下内容至少显示了与这些列相同的所有行中的几个列:

SELECT `Name`, `ZIP`, `Phone`, COUNT(*)
FROM VULNS
GROUP BY `Name`, `ZIP`, `Phone`
HAVING COUNT(*) > 1

John | 56473 | 555-555-555 | 2

问题是我需要包括ID和记录的年份,但是由于它们不在GROUP BY中,所以不能包括它们。如果我将那些列包括在GROUP BY中,那么一切都是唯一的,那么我将不会获得结果。

自从我大量使用SQL以来已经有很长时间了,我认为我用了错误的方法。

2 个答案:

答案 0 :(得分:1)

我会使用exists

SELECT v.*
FROM VULNS as v
WHERE v.YearRecord = 2019 AND
      EXISTS (SELECT 1
              FROM VULNS as v2
              WHERE v2.Name = v.Name AND
                    v2.ZIP = v.ZIP AND
                    v2.Phone = v.Phone AND
                    v2.YearRecorded <> v.YearRecorded 
             );

也就是说,只需返回2019中另一年匹配的行即可。

答案 1 :(得分:0)

ID包含在GROUP BY列表中,以进行子查询,并使用( Name, ZIP, Phone, YearRecorded)与应考虑MAX(YearRecorded)的子查询进行排序:

SELECT `ID`, `Name`, `ZIP`, `Phone`, `YearRecorded`
  FROM VULNS
 WHERE (`Name`, `ZIP`, `Phone`, `YearRecorded`) in 
(
 SELECT `Name`, `ZIP`, `Phone`, MAX(`YearRecorded`)
   FROM VULNS v
  GROUP BY `ID`, `Name`, `ZIP`, `Phone`
 HAVING COUNT(*) > 1
)