【问题标题】:SQL Check for duplicated username in TableSQL 检查表中重复的用户名
【发布时间】:2011-12-09 05:38:16
【问题描述】:

我正在使用 VS2005 C# 和 SQL Server 2005。我想形成一个具有以下条件的 SQL 查询:

检查 Table1 tb1 中的重复用户,其中 tb1 有多个 [Emp.Name]

编辑

简单地说,如果我只检查重复的[emp name],我就无法选择[employeeID]

因为如果我使用

INSERT INTO DuplicateUserInTb1(EmployeeID, [Emp Name], Status, Issue)
SELECT tb1.EmployeeID, tb1.[Emp Name], 'Active', 'Duplicated user in Table1'
FROM Table1 tb1 GROUP BY tb1.[employeeID], tb1.[emp name] HAVING COUNT(tb1.[emp name]) >1 

我将无法看到插入的任何重复的[emp name] 行。

但是,如果我使用

INSERT INTO DuplicateUserInTb1([Emp Name], Status, Issue)
SELECT tb1.EmployeeID, tb1.[Emp Name], 'Active', 'Duplicated user in Table1'
FROM Table1 tb1 GROUP BY tb1.[emp name] HAVING COUNT(tb1.[emp name]) >1

我可以检索重复的[emp name],但是没有[employeeID]


已编辑:

分别处理 ZohalibMichal Powaga 提供的这两个查询:

 INSERT INTO DuplicateUserInTb1(EmployeeID, [Emp Name], Status, Issue) 
 select t.emp_id, t.empname, t.active, t.du 
from (select s1.emp_id, s1.empname,'Active' as active, 'Duplicate User' as du,
ROW_NUMBER() OVER (PARTITION BY s1.empName ORDER BY s1.empName) as rowNum 
from table s1, 
(select emp_name, count(*)
 from table 
 group by emp_name
 having count(*) > 1) s2
 where s1.emp_name = s2.emp_name 
) t where t.rowNum = 1

错误:没有为 's2 的第 2 列指定任何列


insert into DuplicateUserInTb1(EmployeeID, [Emp Name], Status, Issue)
select employeeID, [emp name], 'Active', 'Duplicated user in Table1'
from Table1 t1
join (
    select [emp name]
    from Table1
    group by [emp name]
    having count(*) > 1
) t on t1.[emp name] = t.[emp name]

错误:*Ambiguous column name '[Emp name]'


不胜感激,谢谢。

【问题讨论】:

  • 此查询在 INSERT 中有 3 列,但在 SELECT 中有 4 列?
  • 我的错误。已编辑:为 SELECT 语句添加了附加列
  • 您正在插入并从同一个表中选择。你想达到什么目的?我以为你把它们搬到别处了。
  • 只需在第二个查询@user1084683 中选择employeeID, t.[emp name], 'Active', 'Duplicated user in Table1'
  • @user1084683 对于我的查询,您只需要提及 count() 列的名称,就这样做。 select (select emp_name, count() as counts

标签: c# sql sql-server sql-server-2005


【解决方案1】:

当您使用 Group By 子句时,您的 select 子句只能包含列

在 group by 子句中提及

或聚合函数,例如 Count、SUM 等 http://www.w3schools.com/sql/sql_groupby.asp

此外,在您的查询中,您在三列中插入值,但您的 select 子句选择了四个值,这不是问题吗?

尝试以下查询以根据 empname 插入重复项

    INSERT INTO DuplicateUserInTb1(EmployeeID, [Emp Name], Status, Issue) 
select t.emp_id, t.empname, t.active, t.du 
from (select s1.emp_id, s1.empname,'Active' as active, 'Duplicate User' as du, ROW_NUMBER() OVER (PARTITION BY s1.empName ORDER BY s1.empName) as rowNum 
from table s1, 
(select emp_name, count(*) as counts
 from table 
 group by emp_name
 having count(*) > 1) s2
 where s1.emp_name = s2.emp_name 
) t where t.rowNum = 1

【讨论】:

  • @Zohalib。我的错误,我做了必要的改变。
  • @user1084683 如果在 group by 子句中添加另外两列,问题应该不会解决吗?
  • @Zohalib 在我的 sql 中用于对 table2 进行重复用户检查,它在 GROUP by 子句中有 2 个变量,因此它同时采用 [EmployeeID][Emp Name] 的列,并通过检查它们对任何重复项。现在我只想接受[Emp Name] 进行重复检查,所以我假设我只需要GROUP BY tb2.[Emp Name]?
  • @RUiHAO 对不起,我的错,忘了自我加入,想法是加入自己的表,并选择两个都存在empname的行,会出现重复的名称,现在分配它们的行号,并仅选择 1 以插入其他表。
  • @RUiHAO 我已经在答案中编辑了上面的sql查询,我现在没有安装dbms,所以无法测试查询。
【解决方案2】:
insert into DuplicateUserInTb1(EmployeeID, [Emp Name], Status, Issue)
select t1.employeeID, t1.[emp name], 'Active', 'Duplicated user in Table1'
from Table1 t1
join (
    select [emp name]
    from Table1
    group by [emp name]
    having count(*) > 1
) t on t1.[emp name] = t.[emp name]

【讨论】:

  • 它给了我一个错误,上面写着Ambiguous column name '[Emp name]'.
  • 嗨 Michal Powaga,我添加了 SELECT DISTINCT,因为它为找到的每个重复用户显示相同的记录。但是,有没有办法将两个相同的重复用户匹配在一起?因为找到的重复用户列表分散在表中。是否可以按名称将它们排序在一起?如果我不输入 DISTINCT,每个找到的重复记录将在表中列出 x6 次。知道为什么会这样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
相关资源
最近更新 更多