2017-07-26 31 views
1

データベースに重複したメールがいくつかありますが、削除できません。 私はいくつかのフィールドを選択しますが、メールは重複しません。複数のフィールドを持つ別名を作成する方法

私はこのような要求をしている:私はこの要求を起動すると、メールで私の重複した値は、ここではすでに

SELECT 
DISTINCT MAIL, 
ID, 
CIVILITE, 
PRENOM, 
NAME 
FROM CONTACT WHERE CODE_PAYS = 'DE' 

です。

どうすればいいですか?


更新:私はthisアプローチを試してみましたが、私はビューでそれを使用する必要があります。

ALTER VIEW ALL_VW_CONTACT_DE WITH SCHEMABINDING 
AS 
with cte as 
(
    select rn = row_number() over (partition by c.Mail Order By c.Id asc), c.Mail, c.Id, c.Civilite, c.Prenom, c.Name 
    from dbo.CONTACT c 
    where code_pays = 'DE' 
) 
select Mail, Id, Civilite, Prenom, Name 
from cte 
where rn = 1 

しかし、これは動作しません、私はこのエラーを取得:

Cannot schema bind view 'MY_TABLE' because name 'CONTACT' is invalid for schema binding. Name must be in two-part format and an object cannot reference itself

+1

期待される出力のサンプルデータを追加 –

+0

すべてのフィールドにDistinctが適用されます。それはただの横だけではありません。したがって、1つの行だけが同じメール、ID、市民権、プレノーム、名前の組み合わせを持つようにします。 – litelite

+0

フィールドメールにDISTINCTを追加することは可能ですか? – dutycorpse

答えて

3

あなたはROW_NUMBER使用することができます。行ごとに一意である必要があるため、他のフィールドをグループ化することはできません。それをクエリから削除しても問題ありません。

個別のクエリを実行するときには、結果を確認し、異なる値を返す列を見つけることが重要です。それがその違いです。ご質問に結果を追加すると、さらにお手伝いできます。

6

When I launch this request, my duplicate values on mail are already here.

理由はDISTINCTがあなたは考える。 DISTINCTキーワードの後の最初の列だけは表示されませんが、リスト内のすべての列が比較されます。したがって、すべてが等しい場合は、重複と見なされます。

一つの簡単な方法は、ROW_NUMBERを使用している:

with cte as 
(
    select rn = row_number() over (partition by c.Mail Order By c.Id asc), c.* 
    from dbo.Contact c 
    where Code_Pays = 'DE' 
) 
select Mail, Id, Civilite, Prenom, Name 
from cte 
where rn = 1 

変更order byあなたが別のレコードを取りたい場合は、ここで私が分-IDと1を取ります。

+0

どこで私のcode_paysのどこに節を置くことができますか?私はdbo.Contactこれが動作していない – dutycorpse

+0

@dutycorpse:共通テーブル式で、私は私の答えを編集しました –

+0

私はエラーがあります: 'CONTACT'スキーマバインディングのため無効なスキーマバインドビュー 'MY_TABLE'。名前は2つの部分からなる形式でなければならず、オブジェクトは自分自身を参照することはできません – dutycorpse

1

他のフィールドでDISTINCTを使用すると、これらのフィールドの元の組み合わせのみが取得されます。この場合の

、クエリ(おそらくID)からすべての動的フィールドを除外する必要があります。ここでの問題は、おそらくIDフィールドである

Select top (1) with ties * from Contact 
    where CODE_PAYS = 'DE' 
    order by row_number() over(partition by mail order by id) 
0

以下のよう

SELECT 
DISTINCT MAIL, 
CIVILITE, 
PRENOM, 
NAME 
FROM CONTACT WHERE CODE_PAYS = 'DE' 
関連する問題