2

テーブル内の重複の可能性を識別する SQL コードが必要です。私のテーブルに4つの列があるとしましょう:

  • ID(主キー)

  • 日付1

  • 日付2

  • グループID

(Date1、Date2、GroupID) が一意のキーを形成します。

このテーブルには一度にデータのブロックが取り込まれ、そこに既に存在する多数のレコードを含む新しいブロックが読み込まれることがよくあります。一意のキーがそれらをキャッチする限り、これは問題ありません。残念ながら、最初または後続のアップロードで、Date1 が空 (または少なくとも '1900/01/01') になることがあります。

したがって、(Date2, GroupID) の組み合わせが複数回出現する場所と、いずれかのレコードの Date1 = '1900/01/01'を特定する必要があります。

ありがとう

カール

4

7 に答える 7

2

bkm のようなものがありますが、一部のデータベースでは内部選択のパフォーマンスが低下する可能性があります。これはより簡単です:

select t1.* from 
t as t1 left join t as t2 
on (t1.date2=t2.date2 and t1.groupid=t2.groupid)
where t1.id != t2.id and (t1.date1='1900/01/01' or t2.date2='1900/01/01')
于 2009-08-25T05:33:14.473 に答える
1

を使用して (date2, GroupID) の重複を識別できます。

Select date2,GroupID
from t
group by (date2,GroupID)
having count(*) >1

これを使用して、重複しているメイン テーブルのレコードを特定します。

Select *
from t
where date1='1900/01/01'
and (date2,groupID) = (Select date2,GroupID
                       from t
                       group by (date2,GroupID)
                       having count(*) >1)

注: Date1、Date2、GroupID は一意のキーを形成するため、Date1 を NULL にできる設計が正しいかどうかを確認してください。(date2,GroupID) が同じであるのに、Date 1 が 2 つの行で異なるという本物のケースがある可能性があります。

于 2009-08-25T05:28:16.573 に答える
1

私の理解が正しければ、GroupID と Date2 が同じ ID のグループを探しています。1900/01/01 とは異なる Date1 が 1 回出現し、残りの Date1 はすべて 1900/01/01 です。

私がそれを正しければ、ここにあなたのためのクエリがあります:

SELECT T.ID 
FROM Table T1
WHERE 

(T1.GroupID, T1.Date2) IN
    (SELECT T2.GroupID, T2.Date2
    WHERE T2.Date1 = '1900/01/01' OR
        T2.Date IS NULL
    GROUP BY T2.GroupID, T2.Date2)

AND 

1 >= 
(
    SELECT COUNT(*) 
    FROM TABLE T3
    WHERE NOT (T3.Date1 = '1900/01/01') 
    AND NOT (T3.Date1 IS NULL)
    AND T3.GroupID = T1.GroupID
    AND T3.Date2 = T1.Date2
)

それが役立つことを願っています。

于 2009-08-25T05:33:01.930 に答える
0
select * from table a
join (
select Date2, GroupID, Count(*)
from table
group by Date2, GroupID
having count(*) > 1
) b on (a.Date2 = b.Date2 and a.GroupID = b.GroupID)
where a.Date1 = '1900/01/01'
于 2009-08-25T05:32:28.640 に答える
0

おそらくチェック制約。

の線に沿った何かselect count(*) where date1 = '1900/01/01' and date2 = @date2 and groupid = @groupid

テーブルレベルの制約でこれを行うことができるかどうかを確認する必要があります....

于 2009-08-25T05:24:38.360 に答える
0

テーブルに PRIMARY KEY フィールドを定義するだけでなく、他の UNIQUE 制約を追加して、求めているのと同じ種類のことを実行することもできます。特定の列または列のセットがテーブル内で一意の値を持っていることを検証します。

例については、MySQL マニュアルのエントリを確認してください。

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

于 2009-08-25T05:27:32.347 に答える
0

これは、私が考えることができる最も簡単な方法です。

SELECT DISTINCT t1.*
FROM t t1 JOIN t t2 USING (date2, groupid)
WHERE t1.date1 = '1900/01/01';

GROUP BY一部のブランドのデータベースではパフォーマンスが低下する を使用する必要はありません。

于 2009-08-25T05:42:25.203 に答える