2012-03-16 16 views
34

SQLを使用して、テーブル内の特定の列にデータが複数回表示されているかどうかを確認したい。ここで私がこれまで持っているものの、私のSQLコードは次のとおりです。アイテムがデータベース列に複数回表示されるかどうかを確認

select * from AXDelNotesNoTracking where count(salesid) > 1 

salesidは、私が確認したい列、任意の助けをいただければ幸いです、感謝です。

+2

何様々な? MySQL? Microsoft SQL Server?オラクル?アクセス?等 – UnhandledExcepSean

答えて

80

それは次のようになります。

SELECT SalesID, COUNT(*) 
FROM AXDelNotesNoTracking 
GROUP BY SalesID 
HAVING COUNT(*) > 1 

あなたの最初のクエリについて:

  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 

もちろん、これは同じSalesIDで登場したが、複数回出現した最初のSalesID値を表示していない行を示しています。つまり、SalesIDが3回表示された場合、このクエリはインスタンス2と3を表示しますが、最初のインスタンスは表示しません。それでも、複数のSalesID値を探している理由に応じて役立ちます。

EDIT2:

次のクエリは、以下APCによって掲示し、それがSalesIDが複数回登場しているのすべての行を示している中で、私は上記の言及CTEよりも優れていました。私は完全性のためにここに含めています。 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 
0

はこれを試してみてください。

select salesid,count (salesid) from AXDelNotesNoTracking group by salesid having count (salesid) >1 
+0

-1これは、元の質問が要求しているので、複数回現れるレコードのみを識別するためのHAVING句がありません。 –

+0

彼は1つ以上のレコードを見るだけで、それをチェックしたいとは言及していませんでした。 –

+1

質問は次のように書いています: "データが特定の列に複数回出現するかどうかを確認したい。 HAVING節がなければ、すべての値が返されます。テーブルが大きい場合は、複数回表示される値を見つけるのが難しくなります。 –

4

方法について:SQLの

select salesid from AXDelNotesNoTracking group by salesid having count(*) > 1; 
関連する問題