我有一个正在运行的SQL查询,但是我需要再添加一列。该列在另一张表上,我不知道如何将它们组合在一起。
这是有效的代码...选择所有与另一个用户共享姓氏和名字的活跃用户(我们正在寻找重复的人)
SELECT UserTable.LastName,
UserTable.FirstName
FROM UserTable
INNER JOIN InfoTable
ON InfoTable.ID=UserTable.ID
WHERE InfoTable.Number > 2500 and Infotable.Inactive = 0
GROUP BY FirstName,
LastName
HAVING COUNT(*) > 1;
我需要做的是修改此代码,以便我可以显示位于InfoTable上的NUMBER列,但是我不想在GROUP BY中包括NUMBER,因为NUMBER始终都是唯一的,因此将不会返回任何结果。
答案 0 :(得分:0)
您不能SELECT
以外的GROUP BY
列。 GROUP BY
子句告诉引擎从指定的列中创建组。将行分组后,您只能在SELECT
子句中的GROUP BY
列或未分组列的集合中。
类似的事情应该起作用。首先,子查询获得重复的FirstName
/ LastName
对,然后主查询JOIN
返回到原始表,以向您显示所需的输出。
SELECT I.Number, U.LastName, U.FirstName
FROM InfoTable I
JOIN UserTable U
ON I.ID = U.ID
JOIN
(
SELECT U.LastName, U.FirstName
FROM UserTable U
JOIN InfoTable I
ON U.ID = I.ID
WHERE I.Number > 2500 AND I.Inactive = 0
GROUP BY U.LastName, U.FirstName
HAVING COUNT(*) > 1
) T
ON U.FirstName = T.FirstName AND U.LastName = T.LastName
ORDER BY I.Number, U.LastName, U.FirstName
答案 1 :(得分:0)
如果您的RDBMS支持Windows函数(又名OLAP函数),则只需执行以下操作:
SELECT x.*
FROM (
SELECT
u.LastName,
u.FirstName,
i.Number,
COUNT(u.ID) OVER (PARTITION BY u.LastName, u.FirstName) cnt
FROM
UserTable u
INNER JOIN InfoTable i
ON u.ID = I.ID
AND i.Number > 2500
AND i.Inactive = 0
) x WHERE x.cnt > 1
ORDER BY 1, 2, 3
内部查询使用COUNT ... OVER
向每个记录添加具有相同名字和姓氏的用户数,外部查询使用同音异义词过滤。