2012-07-05 24 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