【问题标题】:C# SQL Adding a query check for duplicated keyC# SQL 添加重复键的查询检查
【发布时间】:2011-11-16 21:23:26
【问题描述】:

我正在尝试在我当前的 SQL INSERT INTO 语句中添加一个查询。下面是我的表格和当前的 sql 语句。

我有 3 张桌子:

Table1用户 ID用户名

Table2用户 ID状态

Table3用户 ID用户名问题

目前我只有 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 中检查重复的用户 ID:

  1. 检查具有相同大写字母的相同用户 ID(例如 E01 和 E01 不应存在)
  2. 检查相同的用户 ID 但不同的大写(例如 E01 和 e01 不应存在)

如何编写专门检查重复用户 ID 的第 4 个 sql 查询?

感谢您的帮助。

【问题讨论】:

  • 默认情况下 SQL 查询不区分大小写。
  • @BrandonMoore:有风险的语句 - SQL Server 中的大小写敏感性取决于用于数据库、表和/或列的 排序规则 .... 可以 区分大小写或不区分大小写...
  • @Mark Care 打赌他的排序规则是否区分大小写?我不喜欢赚快钱 :) 但是,是的,我知道你是对的。
  • @BrandonMoore 所以我不可能检查是否区分大小写?如果我想检查重复项,可以吗?
  • 不,这不是不可能的。您可以在查询中指定排序规则,但默认情况下它不区分大小写(除非您的数据库的排序规则设置为区分大小写,但这不太可能)。看起来你不希望它区分大小写,所以这个默认行为是你想要的,对吧?

标签: c# sql


【解决方案1】:

唯一的 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)
       )

【讨论】:

  • 感谢您的解决方案。参考您的代码,当发现重复的用户标识时会发生什么?
  • 我想识别所有重复项而不是忽略它们,就像上面 3 次检查的问题一样,并给重复的键一个问题,例如'发现重复的用户 ID'。
  • 如果这是您所希望的,请告诉我。
  • 现在已更正,查询的其余部分是否提供了您想要的内容?
  • 我仍在将所有变量转换为我的用途,需要一段时间 :)
【解决方案2】:

已编辑:

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 进行区分大小写的检查。

我使用 RANK=2 只为重复的用户 ID 插入一个条目

旧: 您可以使用 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)

【讨论】:

  • 嗨日吉,我很抱歉没有清楚地解释自己。我试图在每个表中实现重复记录,Table1Table2 单独,而不是通过比较两个表。对不起,谢谢。
【解决方案3】:

正如人们评论的那样 - 区分大小写是通过排序规则设置的。

至于检查重复键 - 您可以使用 EXISTS keyword
像这样的:

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

但是,如果您愿意禁用插入重复 ID,则应改为设置主键/唯一索引。

编辑: 查询表 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 中的重复查询将非常相似。

【讨论】:

  • 如何将您的代码集成到我当前的代码中,以便如果在 Table1 和 Table2 中发现重复的用户 ID,它会将用户 ID、用户名和问题(找到重复的用户 ID)插入到表 3 中?跨度>
  • 让我确保我理解您的意思:当且仅当 Table1 和 Table2 包含相同的用户 ID 时,您想将行插入 Table3?
  • 不。我只想在每个 Table1Table2 本身中找到重复记录时才插入记录。因此,问题将是“表 1 中发现重复记录”和“表 2 中发现重复记录”。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 2011-12-11
相关资源
最近更新 更多