我有一个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
在上面的例子中,我需要找到杰克和玛丽,但不是弗雷德。我假设某种自我加入或联盟,但已经遇到了什么会给我我想要的结果的精神障碍。
答案 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)
这有几个组成部分:
这很容易。根据您的SQL版本,您基本上可以:
select count(*) as numbers, Name from this_table having numbers >= 2 group by Name
这会增加复杂性,但最终还不错。
select count(*) as numbers, Name from this_table where StartDate is not null having numbers >= 2 group by Name
处理同样为空的重复项 这是您原始问题中未提及的情况。假设我有三个人,两个是日期但是一个是空的。我们是否想要这些记录?如果我们这样做,那么第2部分中的查询就可以了。如果我们不这样做,那么我们需要一个子选择,如:
选择count(*)作为数字,来自this_table的名称,其中Name不在(从this_table中选择Name,其中StartDate为null),数字> gt; = 2 group by Name
也就是说,除非你有一个比名字更独特的东西,否则这些查询不是很有用。尤其是名字过于普遍。