2012-07-05 105 views
0

继承人我的场景。SQL - 删除重复而没有“硬”编码?

我有一个3行的表我想在存储过程中返回,行是电子邮件,名称和ID。 ID必须= 3或4,并且电子邮件只能是每个用户,因为有些人有多个条目。

我有一个Select语句如下

SELECT 
    DISTINCT email, 
    name, 
    id 
from table 
where 
    id = 3 
    or id = 4 

好很简单,但也有一些用户,其具有都是3和4,使他们出现两次,如果他们出现的条目两次我想只有那些具有IDS剩下4个。我将在下面举另一个例子作为难以解释的例子。

表 -

Email    Name Id 
[email protected] jimmy 4 
[email protected] brian 4 
[email protected] kevin 3 
[email protected] jimmy 3 

因此,在上述情况下我会想忽略与3号吉米,这样做没有硬编码的方法吗?

感谢

+0

RDBMS是否使用的是(MySQL和甲骨文等...)?请_always_用标签标记SQL问题,因为您正在使用的RDBMS可能有一些额外的功能可以提供帮助。 – Ben 2012-07-05 20:48:22

+0

对不起,它的SQL Server如此T-SQL。感谢所有的答复。认为最大(id)应该做的伎俩,非常感谢 – DtotheG 2012-07-05 21:41:20

回答

2
SELECT 
    email, 
    name, 
    max(id) 
from table 
where 
    id in(3, 4) 
group by email, name 
+1

你必须意味着MAX()从OPs例子。 – MatBailie 2012-07-05 21:14:30

+0

纠正..谢谢 – Randy 2012-07-05 22:43:15

+0

这工作的一种享受。谢谢:) – DtotheG 2012-07-06 07:39:29

0

这是你想要达到什么样的?

SELECT Email, Name, MAX(Id) FROM Table WHERE Id IN (3, 4) GROUP BY Email; 
+1

除非它是MySQL你必须* GROUP BY名字。 – MatBailie 2012-07-05 21:15:33

+0

T-SQL也必须具有GROUP BY名称。这也没有考虑具有不同电子邮件地址的相同名称,这是一种可能性,因为表结构。 – user1166147 2012-07-05 21:28:20

0

有时使用Having Count(*) > 1可能会有助于查找重复的记录。

select * from table group by Email having count(*) > 1 

select * from table group by Email having count(*) > 1 and id > 3. 

与选择MAX(ID)从表之前提供的解决方案听起来不错这种情况。 这也许是一种替代解决方案。

0

您使用的是什么RDMS? 这将返回只有一个 “吉米”,使用RANK()

SELECT A.email, A.name,A.id 
FROM SO_Table A 
INNER JOIN(
SELECT 
email, name,id,RANK() OVER (Partition BY name ORDER BY ID DESC) AS COUNTER 
FROM SO_Table B 
) X ON X.ID = A.ID AND X.NAME = A.NAME 
WHERE X.COUNTER = 1 

返回:

email   name id 
------------------------------ 
[email protected] jimmy 4 
[email protected] brian 4 
[email protected] kevin 3