Sql 选择子查询中存在的内容

Sql 选择子查询中存在的内容,sql,sql-server,sql-server-ce,Sql,Sql Server,Sql Server Ce,我想计算具有重复值的记录的数量,然后获取与之相关的各种其他数据。像这样: SELECT Id, Name, PhoneNumber, Code, CodeCount from Person WHERE Code IN (SELECT Code, COUNT(Code) AS CodeCount FROM Person GROUP BY Code HAVING COUNT(Code) > 1); 但是

我想计算具有重复值的记录的数量,然后获取与之相关的各种其他数据。像这样:

SELECT Id, Name, PhoneNumber, Code, CodeCount from Person
WHERE Code IN (SELECT Code, COUNT(Code) AS CodeCount
               FROM Person
               GROUP BY Code
               HAVING COUNT(Code) > 1);
但是我得到的错误是子查询中的列不匹配

如何实现这一点?

您正在…中编写代码,但子查询返回的是两列而不是一列

从子查询中删除附加列

您不需要返回计数。HAVING子句的工作原理是一样的,即使您没有在子查询中返回该列

SELECT Id, Name, PhoneNumber, Code, CodeCount from Person
WHERE Code IN (SELECT Code
           FROM Person
           GROUP BY Code
           HAVING COUNT(Code) > 1);
您正在…中执行代码,但子查询返回的是两列而不是一列

从子查询中删除附加列

您不需要返回计数。HAVING子句的工作原理是一样的,即使您没有在子查询中返回该列

SELECT Id, Name, PhoneNumber, Code, CodeCount from Person
WHERE Code IN (SELECT Code
           FROM Person
           GROUP BY Code
           HAVING COUNT(Code) > 1);

注意:这在SQLServerCE上不起作用,但在SQLServer2005+上起作用

另一种方法是使用窗口函数:

select p.*
from (select p.*, count(*) over (partition by code) as cnt
      from person p
     ) p
where cnt > 1;

因为in需要聚合和连接,因为in隐式地需要聚合和连接,所以此版本通常具有更好的性能。它还可以使用personcode上的索引。

注意:这在SQL Server CE上不起作用,但在SQL Server 2005+上起作用

另一种方法是使用窗口函数:

select p.*
from (select p.*, count(*) over (partition by code) as cnt
      from person p
     ) p
where cnt > 1;
因为in需要聚合和连接,因为in隐式地需要聚合和连接,所以此版本通常具有更好的性能。它还可以利用personcode上的索引。

这将对您有效

    SELECT Id, Name, PhoneNumber, Code, COUNT(Code) AS 'CodeCount' 
    from Person WHERE Code IN (SELECT Code FROM Person) 
    GROUP BY Id, Name, PhoneNumber, Code HAVING COUNT(Code) > 1;
这对你有用

    SELECT Id, Name, PhoneNumber, Code, COUNT(Code) AS 'CodeCount' 
    from Person WHERE Code IN (SELECT Code FROM Person) 
    GROUP BY Id, Name, PhoneNumber, Code HAVING COUNT(Code) > 1;
SQL 2015+: 从人员P中选择P.Id、P.Name、P.PhoneNumber、P.Code、Q.CodeCount 交叉应用SELECT Id,COUNTCode按代码作为CodeCount进行超额分配 从人名Q 其中P.Id=Q.Id和Q.codecont>1

SQL 2015+: 从人员P中选择P.Id、P.Name、P.PhoneNumber、P.Code、Q.CodeCount 交叉应用SELECT Id,COUNTCode按代码作为CodeCount进行超额分配 从人名Q



其中P.Id=Q.Id和Q.CodeCount>1不适用于使用Sql Server Compact的我。。。可能不支持使用Sql Server Compact对我不起作用。。。如果我错了,可能没有人支持纠正我,但这意味着我必须按所有列分组,不是吗?我只想计算一列上的重复项,而不是所有重复项。是的,这将对所有列进行分组,如果其中一列不在group BY子句中,则无法在SELECT中进行计数,是的,上面的答案将只显示代码大于1的地方。这就是我的想法。。。所以它并没有真正给出期望的结果。谢谢您的尝试。@hbob您试过了吗,如果要在不分组这些列的情况下进行计数,还需要在SELECT语句中删除这些列,并且不能在子查询中进行计数,因为in子句只需要1个返回列。您的案例中有2个返回列。是的,就像我说的,它不能满足我的需要;如果我错了,请纠正我,但这意味着我必须按所有列分组,不是吗?我只想计算一列上的重复项,而不是所有重复项。是的,这将对所有列进行分组,如果其中一列不在group BY子句中,则无法在SELECT中进行计数,是的,上面的答案将只显示代码大于1的地方。这就是我的想法。。。所以它并没有真正给出期望的结果。谢谢您的尝试。@hbob您试过了吗,如果要在不分组这些列的情况下进行计数,还需要在SELECT语句中删除这些列,并且不能在子查询中进行计数,因为in子句只需要1个返回列。您的案例中有2个返回列。是的,就像我说的,它不能满足我的需要;好吧,如果我排除codecont,这至少可以正常工作,但我需要它。。。它显示重复的数量。如何将其包含在结果中?好吧,如果我排除codecont,这至少可以正常工作,但我需要它。。。它显示重复的数量。如何将其包含在结果中?选择Id、姓名、电话号码、代码、来自人员内部的CodeCount连接选择Id、代码、COUNTCode作为来自人员组的CodeCount,按COUNTCode>1作为ON Id=A.IDI聚合和分组表达式的代码,SELECT子句只能包含聚合和分组表达式。您可以从Person inner join SELECT Id、Code、,COUNTCode AS CodeCount FROM Person GROUP BY Code的COUNTCode>1作为ON Id=A.IDI在聚合和分组表达式中,SELECT子句只能包含聚合和分组表达式。您可以在原始表中获取结果聚合函数