2009-12-11 93 views
0

我试图从表中选择一行,每个电子邮件地址一行,并从电子邮件列表中的第一行返回一个名。但是,该查询会返回多个电子邮件地址。我究竟做错了什么?选择不同+选择顶部合并多行

SELECT 
    DISTINCT email, 
    (SELECT TOP 1 firstname 
    FROM onsite_clients_archive oc 
    WHERE oc.client_id=oca.client_id 
    ORDER BY client_id) 
FROM onsite_clients_archive oca 
WHERE users_user_id IS NULL 
+0

什么数据库?查询看起来是正确的 - 请显示一些数据和预期的结果。 – 2009-12-11 18:42:08

回答

3

你的bug是WHERE oc.client_id = oca.client_id应该是WHERE oc.email = oca.email

你没有说你正在使用哪个DBMS,但是如果它是MS SQL,下面也会做你想做的。

SELECT email, firstname 
FROM (
    SELECT 
     email, firstname, 
     ROW_NUMBER() OVER (PARTITION BY email ORDER BY client_id DESC) AS intRow 
    FROM onsite_clients_archive 
    WHERE users_user_id IS NULL 
) AS T 
WHERE intRow = 1 
0

的DISTINCT将适用于您的列列表中的所有列,所以在这种情况下,如果有在Onsite_Clients_Archive多行具有相同的电子邮件地址,然后你会得到那些来自查询回来,只要他们有一个不同的名字。

想想你想做什么......你想要每一个不同的(不一定在这里指SQL关键字)电子邮件地址的第一个名称匹配它(首先由client_id的顺序定义)。这对我来说很难说没有看到实际的数据模型,但这是我的第一个猜测:

SELECT 
    T1.email, 
    T1.first_name 
FROM 
    Onsite_Clients_Archive T1 
LEFT OUTER JOIN Onsite_Clients_Archive T2 ON 
    T2.email = T1.email AND 
    T2.client_id < T1.client_id 
WHERE 
    T2.client_id IS NULL -- Assuming that this is a not null column, the only way it could be NULL is if there was no match