SQLステートメントを使って複数のフィールドの重複を見つけることができますか?
たとえば、疑似コードでは、
select count(field1,field2,field3)
from table
where the combination of field1, field2, field3 occurs multiple times
上記のステートメントから 複数回出現する場合 - 最初のレコードを除くすべてのレコード - を選択したい 。
複数のレコードがあるフィールドのリストを取得するには、..を使用できます。
select field1,field2,field3, count(*)
from table_name
group by field1,field2,field3
having count(*) > 1
行を削除する方法の詳細については、このリンクを確認してください。
http://support.Microsoft.com/kb/139444
編集:他のユーザーが述べたように、あなたが上のリンクのアプローチを使う前にあなたがどのように "最初の行"を定義するか決めるための基準があるべきです。それに基づいて、必要に応じてorder by句とサブクエリを使用する必要があります。あなたがいくつかのサンプルデータを投稿することができればそれは本当に役立つでしょう。
あなたは「最初のもの」に言及しているので、私はあなたがあなたのデータにある種の順序を持っていると思います。あなたのデータが何らかのフィールドID
によって順序付けられていると仮定しましょう。
このSQLは最初のものを除いてあなたに重複したエントリを取得するはずです。基本的には、(a)同じフィールドと(b)低いIDを持つ別の行が存在するすべての行を選択します。パフォーマンスは良くありませんが、問題が解決する可能性があります。
SELECT A.ID, A.field1, A.field2, A.field3
FROM myTable A
WHERE EXISTS (SELECT B.ID
FROM myTable B
WHERE B.field1 = A.field1
AND B.field2 = A.field2
AND B.field3 = A.field3
AND B.ID < A.ID)
これは私が好きなSQL Server 2005の楽しい解決策です。 「最初のレコードを除くすべてのレコードについて」とは、「最初の」行を識別するために使用できる別の「id」列があることを意味します。
SELECT id
, field1
, field2
, field3
FROM
(
SELECT id
, field1
, field2
, field3
, RANK() OVER (PARTITION BY field1, field2, field3 ORDER BY id ASC) AS [rank]
FROM table_name
) a
WHERE [rank] > 1
重複した値を見るには:
with MYCTE as (
select row_number() over ( partition by name order by name) rown, *
from tmptest
)
select * from MYCTE where rown <=1
SQL Server 2005以降を使用していて(そして質問のタグがSQL Server 2008を示している)、結合を使用することがあまり望ましくないか、またはなんらかの理由で実用的でない場合、最初のレコードの後にランク付け関数を使用して重複レコードを返します。次の例では、これを実際に示しています。ここでは、検査対象の列のNULL値に対しても機能します。
create table Table1 (
Field1 int,
Field2 int,
Field3 int,
Field4 int
)
insert Table1
values (1,1,1,1)
, (1,1,1,2)
, (1,1,1,3)
, (2,2,2,1)
, (3,3,3,1)
, (3,3,3,2)
, (null, null, 2, 1)
, (null, null, 2, 3)
select *
from (select Field1
, Field2
, Field3
, Field4
, row_number() over (partition by Field1
, Field2
, Field3
order by Field4) as occurrence
from Table1) x
where occurrence > 1
この例を実行した後、すべての「グループ」の最初のレコードが除外され、NULL値を持つレコードは正しく処理されることに注意してください。
グループ内のレコードを並べ替えるのに使用できる列がない場合は、partition-by列をorder-by列として使用できます。
CREATE TABLE #tmp
(
sizeId Varchar(MAX)
)
INSERT #tmp
VALUES ('44'),
('44,45,46'),
('44,45,46'),
('44,45,46'),
('44,45,46'),
('44,45,46'),
('44,45,46')
SELECT * FROM #tmp
DECLARE @SqlStr VARCHAR(MAX)
SELECT @SqlStr = STUFF((SELECT ',' + sizeId
FROM #tmp
ORDER BY sizeId
FOR XML PATH('')), 1, 1, '')
SELECT TOP 1 * FROM (
select items, count(*)AS Occurrence
FROM dbo.Split(@SqlStr,',')
group by items
having count(*) > 1
)K
ORDER BY K.Occurrence DESC
このクエリを試して、各SELECTステートメントの数を数えます。
select field1,count(field1) as field1Count,field2,count(field2) as field2Counts,field3, count(field3) as field3Counts
from table_name
group by field1,field2,field3
having count(*) > 1