2011-11-15 4 views
1

現在のSQL INSERT INTOステートメントでクエリを追加しようとしています。以下は私のテーブルと現在のSQLステートメントです。C#SQL重複したキーのクエリチェックを追加する

表1ユーザーIDユーザー名

は、私は3つのテーブルを持っています。

表2ユーザーIDステータス

表3ユーザーIDユーザー名

は現在、私は上記のみ3つのチェックを満たし、表3に結果をINSERT 3 SELECTステートメントを持っている:

1. 
    Insert in to Table3(userid,issue) 
     SELECT t1.userid,'check no.1' 
     FROM table1 t1 
     FULL OUTER JOIN table2 t2 ON t1.userid = t2.userid 
     where t1.userid not null and t2.userid is null 
2. 
    Insert in to Table3(userid,issue) 
     SELECT t1.userid,'check no.2' 
     FROM table1 t1 
     inner JOIN table2 t2 ON t1.userid = t2.userid 
     where t2.status = 'DELETE' 

3. 
    Insert in to Table3(userid,issue) 
     SELECT t2.userid,'check no.3' 
     FROM table2 t2 
     right outer JOIN table2 t2 ON t1.userid = t2.userid 
     where t2.status <> 'DELETE' and t1.userid is null 

今度は、T1とT2の両方で重複したユーザーIDを確認する別のチェックを追加します:

  1. 同じキャップで同じユーザーIDを確認してください(例: E01とE01は存在しないはず)
  2. 同じユーザーIDが異なるキャップのためのチェック(例えばE01とE01が存在してはならない)

どのように私は、重複したユーザーIDのために特別にチェック第4回SQLクエリを記述することができますか?

ありがとうございました。

+0

を行うにはCOLLATEを使用することができますが、大文字小文字を区別しません。 –

+1

@BrandonMoore:SQL Serverの危険なステートメント - 大文字と小文字の区別は、データベース、テーブルおよび/または列に使用される**照合**によって決まります。大文字と小文字を区別するか、大文字と小文字を区別することができます。 –

+0

@Mark Careが大文字と小文字を区別しているかどうかについて賭けをしますか?私はいくつかの速い現金を作るためにダウンです:) しかし、はい、私はあなたが正しいことを知っています。 –

答えて

1

編集:

INSERT INTO Table3(userid, Username, issue) 
SELECT 
    userid, Username, 'Duplicate UserID' 
FROM 
    (
     SELECT 
       userid, 
       Username, 
       RANK() OVER (PARTITION BY userid ORDER BY userid) AS [RANK] 
     FROM 
      Table1 --table2 
    ) X 
WHERE 
    [RANK]=2 


INSERT INTO Table3(userid, Username, issue) 
SELECT 
    userid, [status], 'Duplicate UserID' 
FROM 
    (
     SELECT 
       userid, 
       [status], 
       RANK() OVER (PARTITION BY userid ORDER BY userid) AS [RANK] 
     FROM 
      Table2 
    ) X 
WHERE 
    [RANK]=2 

OLDセクションに示されているようにあなたが必要な場合は、大文字と小文字を区別チェックを行うにはCOLLATEを使用することができます。

私は、重複ユーザーIDに対して1つだけのエントリ

OLD挿入することがRANK = 2を使用: あなたは、デフォルトのSQLクエリでは大文字と小文字を区別チェック

INSERT INTO Table3(UserId, Username, Issue) 
    SELECT 
    COALESCE(t1.UserId, t2.UserId), 
    t1.UserName, 
    CASE   
     WHEN (t2.userid IS NULL AND t1.userid IS NOT NULL) 
      THEN 'User exists in t1 but not in t2' 
     WHEN (t2.status = 'DELETE' AND t1.userid IS NOT NULL) 
      THEN 'User Exists in t1, but status in t2 is DELETE' 
     WHEN (t2.userid IS NOT NULL AND t2.status != 'DELETE' AND t1.userid IS NULL) 
      THEN 'Non-Deleted user in t2 does not exist in t1' 
     WHEN t1.userid COLLATE SQL_Latin1_General_CP1_CS_AS = t2.userid COLLATE SQL_Latin1_General_CP1_CS_AS 
      THEN 'Duplicate userid with same caps' 
     WHEN t1.userid = t2.userid 
      THEN 'Duplicate userid but different caps' 
    END 
FROM table1 t1 
FULL OUTER JOIN table2 t2 ON t1.userid = t2.userid 
WHERE 
    (t1.userid IS NOT NULL AND t2.userid IS NOT NULL AND t2.status != 'DELETE' AND t1.userid = t2.userid) OR  
    (t2.userid IS NULL AND t1.userid IS NOT NULL) OR 
    (t2.status = 'DELETE' AND t1.userid IS NOT NULL) OR 
    (t2.userid IS NOT NULL AND t2.status != 'DELETE' AND t1.userid IS NULL) 
+0

こんにちはRiji、私は自分自身をはっきりと説明しなかったことをお詫びします。 * Table1 *と* Table2 *を個別に比較するのではなく、各テーブル内で重複したレコードを作成しようとしています。申し訳ありません、ありがとうございます。 – gymcode

0

人がコメントしたように、大文字と小文字の区別は照合によって設定されます。

重複するキーを確認する場合は、EXISTS keywordを使用できます。このような
何か:

WHEN EXISTS (SELECT * FROM Table3 WHERE userid=t1.UserID) 
    THEN -- DO WHATEVER 

あなたが重複したIDを挿入無効にして喜んでいる場合は、あなたの代わりに主キー/一意のインデックスを設定することによってそれを行う必要があります。

EDIT:表1での重複を見つけるために 問合せ:

Insert into Table3(userid,issue) 
SELECT t1.userid,'Duplicate in table1' 
FROM Table1 t1 
WHERE (SELECT COUNT(*) FROM Table1 _t1 WHERE _t1.userid = t1.userid) > 1 

表2クエリ内の重複のためには非常に似ています。

+0

どのようにして現在のコードにコードを統合して、表1と表2では、ユーザーID、ユーザー名、問題(重複したユーザーIDが見つかりました)をTable3に挿入しますか? – gymcode

+0

私はあなたが何を意味するのか理解してみましょう:Table1とTable2の両方に同じuserIDが含まれている場合にのみ、Table3に行を挿入しますか? – Svarog

+0

それぞれの* Table1 *と* Table2 *内で重複したレコードが見つかった場合にのみレコードを挿入したいと思います。したがって、問題は、 'Table1で見つかった重複レコード'と 'Table2で見つかった重複レコード'になります。ありがとう、 – gymcode

2

一意のuserId制約はおそらくUNIQUE INDEX(パフォーマンスにも役立つはずです)で最もよく適用されますが、重複を入力しないようにするために、これは役立ちます。LEFT JOINをtable3に使用して値

:(レコードが存在しない)

このコードは、重複を無視して、あなたが重複したことを示すレコードを挿入したい場合は、次のように使用でき

INSERT INTO Table3(UserId, Username, Issue) 
SELECT COALESCE(t1.UserId, t2.UserId), t1.UserName 
     , CASE 
      WHEN (t2.userid IS NULL AND t1.userid IS NOT NULL) 
       THEN 'User exists in t1 but not in t2' 
      WHEN (t2.status = 'DELETE' AND t1.userid IS NOT NULL) 
       THEN 'User Exists in t1, but status in t2 is DELETED' 
      WHEN (t2.userid IS NOT NULL AND t2.status != 'DELETE' AND t1.userid IS NULL) 
       THEN 'Non-Deleted user in t2 does not exist in t1' 
     END AS Issue 
    FROM table1 t1 
    FULL OUTER JOIN table2 t2 ON t1.userid = t2.userid 
    LEFT JOIN Table3 AS t3user ON t1.UserID = t3user.UserId 
    LEFT JOIN Table3 AS t3status ON t2.UserId = t3status.UserId 
    WHERE t3user.UserId IS NULL 
     AND t3status.UserId IS NULL 
     AND 
     (
      (t2.userid IS NULL AND t1.userid IS NOT NULL) 
      OR (t2.status = 'DELETE' AND t1.userid IS NOT NULL) 
      OR (t2.userid IS NOT NULL AND t2.status != 'DELETE' AND t1.userid IS NULL) 
     ) 

レコードを挿入しません、現在nullであります

INSERT INTO Table3(UserId, Username, Issue) 
SELECT COALESCE(t1.UserId, t2.UserId), t1.UserName 
     , CASE 
      WHEN (t3user.UserId IS NOT NULL OR t3Status.UserId IS NOT NULL) 
       THEN 'Duplicated userid found: "' + t1.UserId + '"' 
      WHEN (t2.userid IS NULL AND t1.userid IS NOT NULL) 
       THEN 'User exists in t1 but not in t2' 
      WHEN (t2.status = 'DELETE' AND t1.userid IS NOT NULL) 
       THEN 'User Exists in t1, but status in t2 is DELETE' 
      WHEN (t2.userid IS NOT NULL AND t2.status != 'DELETE' AND t1.userid IS NULL) 
       THEN 'Non-Deleted user in t2 does not exist in t1' 
     END AS Issue 
    FROM table1 t1 
    FULL OUTER JOIN table2 t2 ON t1.userid = t2.userid 
    LEFT JOIN Table3 AS t3user ON t1.UserID = t3user.UserId 
    LEFT JOIN Table3 AS t3status ON t2.UserId = t3status.UserId 
    WHERE 

     (
      (t2.userid IS NULL AND t1.userid IS NOT NULL) 
      OR (t2.status = 'DELETE' AND t1.userid IS NOT NULL) 
      OR (t2.userid IS NOT NULL AND t2.status != 'DELETE' AND t1.userid IS NULL) 
     ) 
+0

解決に感謝します。あなたのコードを参照して、重複したユーザIDが見つかった場合、どうなるでしょうか? – gymcode

+0

上記の3つのチェックの問題のように、すべての重複を無視するのではなく、すべての重複を識別したいと思います。 '重複したユーザーIDが見つかりました'。 – gymcode

+0

これがあなたが望んでいたものかどうか教えてください。 –

関連する問題