C # SQL Добавление проверки запроса для дублированного ключа - PullRequest
1 голос
/ 15 ноября 2011

Я пытаюсь добавить запрос в свой текущий оператор INSERT INTO SQL.Ниже моя таблица и текущий оператор SQL.

У меня есть 3 таблицы:

Table1 : UserID , Имя пользователя .

Table2 : UserID , Status .

Table3 : UserID , Имя пользователя , Проблема

В настоящее время у меня есть только 3 оператора SELECT, которые выполняют 3 вышеуказанные проверки, и ВСТАВЬТЕ результат в Table3:

 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:

  1. Проверка того же идентификатора пользователя с одинаковыми заглавными буквами (например, E01 и E01 не должно существовать)
  2. Проверка того же идентификатора пользователя, но разных заглавных букв (например, E01 и e01 не должны существовать)

Как я могу кодировать запрос 4-го sql, который специально проверяет дублированные идентификаторы пользователей?

Спасибо за помощь.

Ответы [ 3 ]

2 голосов
/ 15 ноября 2011

Уникальное ограничение 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)
       )

Если вы хотите вставить запись, указывающую на дубликат, выможет использовать следующее:

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)
       )
1 голос
/ 16 ноября 2011

Отредактировано:

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

Вы можете использовать COLLATE, как показано в разделе СТАРЫЙ, чтобы выполнить проверку с учетом регистра, если вам нужно.

Я использовал RANK = 2 только для вставкиодна запись для дублированного идентификатора пользователя

СТАРЫЙ: вы можете использовать команду COLLATE, чтобы выполнить проверку с учетом регистра

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 голосов
/ 15 ноября 2011

Как прокомментировали люди - чувствительность к регистру задается с помощью сопоставления.

Что касается проверки на наличие дублирующих ключей - вы можете использовать ключевое слово EXISTS .Примерно так:

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

Однако, если вы хотите отключить вставку повторяющихся идентификаторов, вы должны сделать это, установив вместо этого первичный ключ / уникальный индекс.

РЕДАКТИРОВАТЬ: запрос на поискдубликаты в Таблице 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 запрос будет очень похожим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...