当一个字段不同时查找特定的重复项

时间:2014-10-13 17:46:48

标签: sql

我有一个SQL DB表,它有一些数据重复。我需要根据以下事实找到记录:“重复”记录中没有一个在其中一个字段中具有Null值。即。

ID    Name   StartDate
1     Fred   1/1/1945
2     Jack   2/2/1985
3     Mary   3/3/1999
4     Fred   null 
5     Jack   5/5/1977
6     Jack   4/4/1985
7     Fred   10/10/2001

在上面的例子中,我需要找到杰克和玛丽,但不是弗雷德。我假设某种自我加入或联盟,但已经遇到了什么会给我我想要的结果的精神障碍。

4 个答案:

答案 0 :(得分:1)

好的,回过头来重读这个问题。听起来你需要一个子选择而不是连接,虽然连接也可以工作。

WHERE Name NOT IN ( SELECT DISTINCT Name FROM table WHERE StartDate IS NULL )

应该给出所需的结果,根据Fred使用单个NULL日期限定的事实消除所有Fred记录。

答案 1 :(得分:1)

首先创建查询以查找重复项,然后添加一个条件,表明它没有带有NULL的记录StartDate

SELECT Name
FROM myTable
GROUP BY Name
HAVING COUNT(*) > 1
WHERE Name NOT IN (SELECT Name FROM myTable WHERE StartDate IS NULL)

答案 2 :(得分:1)

另一个选择:首先我们选择所有没有字段为空的矩形,我们将它们分组并计算它们。然后我们选择那些总数> 1

select * from (
    select name, startdate, count(*) as total from so group by name, startdate having name is not null and startdate is not null
) as data where total > 1

答案 3 :(得分:0)

这有几个组成部分:

  1. 选择重复
  2. 这很容易。根据您的SQL版本,您基本上可以:

     select count(*) as numbers, Name from this_table having numbers >= 2 group by Name
    
    1. 删除Null
    2. 这会增加复杂性,但最终还不错。

       select count(*) as numbers, Name from this_table  where StartDate is not null having numbers >= 2 group by Name
      
      1. 处理同样为空的重复项 这是您原始问题中未提及的情况。假设我有三个人,两个是日期但是一个是空的。我们是否想要这些记录?如果我们这样做,那么第2部分中的查询就可以了。如果我们不这样做,那么我们需要一个子选择,如:

        选择count(*)作为数字,来自this_table的名称,其中Name不在(从this_table中选择Name,其中StartDate为null),数字> gt; = 2 group by Name

      2. 也就是说,除非你有一个比名字更独特的东西,否则这些查询不是很有用。尤其是名字过于普遍。