查看项目是否在数据库列中出现多次

Cal*_*ass 53 sql

我想检查一块数据是否在使用SQL的表中的特定列中出现多次.这是我到目前为止的SQL代码:

select * from AXDelNotesNoTracking where count(salesid) > 1
Run Code Online (Sandbox Code Playgroud)

salesid 是我希望检查的专栏,任何帮助将不胜感激,谢谢.

Sol*_*zky 117

它应该是:

SELECT SalesID, COUNT(*)
FROM AXDelNotesNoTracking
GROUP BY SalesID
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)

关于您的初始查询:

  1. 您不能执行SELECT*,因为此操作需要GROUP BY,并且列需要位于GROUP BY或聚合函数中(即COUNT,SUM,MIN,MAX,AVG等)
  2. 由于这是GROUP BY操作,因此HAVING子句将过滤它而不是WHERE

编辑:

我只是想到了这一点,如果你想看到多个项目不止一次(但这取决于你使用的是哪个数据库):

;WITH cte AS (
    SELECT  *, ROW_NUMBER() OVER (PARTITION BY SalesID ORDER BY SalesID) AS [Num]
    FROM    AXDelNotesNoTracking
)
SELECT  *
FROM    cte
WHERE   cte.Num > 1
Run Code Online (Sandbox Code Playgroud)

当然,这只显示出现了具有相同SalesID但未显示多次出现的初始SalesID值的行.这意味着,如果SalesID显示3次,则此查询将显示实例2和3,但不显示第一个实例.但是,根据您查找多个SalesID值的原因,它可能会有所帮助.

EDIT2:

以下查询由APC发布,并且比我上面提到的CTE更好,因为它显示了SalesID多次出现的所有行.我把它包括在这里是为了完整.我只是添加了一个ORDER BY来保持SalesID值组合在一起.ORDER BY也可能有助于上述CTE.

SELECT *
FROM AXDelNotesNoTracking
WHERE SalesID IN
    (     SELECT SalesID
          FROM AXDelNotesNoTracking
          GROUP BY SalesID
          HAVING COUNT(*) > 1
    )
ORDER BY SalesID
Run Code Online (Sandbox Code Playgroud)


Mar*_*bak 9

怎么样:

select salesid from AXDelNotesNoTracking group by salesid having count(*) > 1;
Run Code Online (Sandbox Code Playgroud)

  • 认为这是最好的选择,因为它不需要像接受的答案中那样不必要的子查询。 (2认同)