5

残念ながら悪いデータを含むテーブルがあり、一部を除外しようとしています。データ セットが小さいため、LName と FName の組み合わせは一意であると確信しています。

LName, FName, Email
-----  -----  -----
Smith  Bob    bsmith@example.com
Smith  Bob    NULL
Doe    Jane   NULL
White  Don    dwhite@example.com

クエリ結果で、NULL メールを持たない「重複」レコードが返されますが、重複がない場合でも NULL メールが返されるようにしたいと考えています。

例えば

Smith Bob   bsmith@example.com
Doe   Jane  NULL
White Don   dwhite@example.com

解決策はSql, remove duplicate rows by valueに似ていると思いますが、質問者の要件が私のものと同じかどうかはよくわかりません。

助言がありますか?

ありがとう

4

4 に答える 4

8

ROW_NUMBER() 分析関数を使用できます。

SELECT *
  FROM (
                SELECT a.*, ROW_NUMBER() OVER(PARTITION BY LName, FName ORDER BY Email DESC) rnk
                    FROM <YOUR_TABLE> a
                ) a
WHERE RNK = 1
于 2010-12-30T22:09:01.560 に答える
7

これにより、null 以外の値がある場合、null 行が削除されます。

SELECT  lname
        , fname
        , MIN(email)
FROM    YourTable
GROUP BY
        lname
        , fname

テストスクリプト

DECLARE @Test TABLE (
  LName VARCHAR(32)
  , FName VARCHAR(32)
  , Email VARCHAR(32)
)

INSERT INTO @Test
  SELECT 'Smith', 'Bob', 'bsmith@example.com'
  UNION ALL SELECT 'Smith', 'Bob', 'NULL'
  UNION ALL SELECT 'Doe', 'Jane', 'NULL'
  UNION ALL SELECT 'White', 'Don', 'dwhite@example.com'

SELECT  lname
        , fname
        , MIN(Email)        
FROM    @Test
GROUP BY
        lname
        , fname
于 2010-12-30T22:05:51.857 に答える
3

以下は、標準 SQL を使用してこれを行う比較的単純なクエリです。

SELECT * FROM Person P
WHERE Email IS NOT NULL OR -- Take all people with non-null e-mails
      Email IS NULL AND    -- and all people with null e-mails, as long as
        NOT EXISTS         -- there is no duplicate record of the same person
          (SELECT *        -- with a non-null e-mail
           FROM Person P2 
           WHERE P2.LName=P.LName AND P2.FName=P.FName AND P2.Email IS NOT NULL)
于 2010-12-30T22:06:16.817 に答える
1

すでに多くの SQL ソリューションが投稿されているため、データ修正を作成して不良データを削除し、必要な制約を追加して不良データが挿入されないようにすることをお勧めします。データベース内の不適切なデータは、不適切な設計の副作用です。

于 2010-12-30T22:26:10.127 に答える