如何找到扭曲的独特

时间:2016-02-19 14:50:58

标签: sql sql-server

Table A
SSN - PK
first_name 
Last_name

Table B 
SSN
Address (email)
Primary_email 

我有一个列表,其中包含多个不同的电子邮件ID,并将其指定的主电子邮件ID设为X.

e.g ryan C might have 2 diff email id     
ryan@gmail.com,    
ryan.p@verizon.com ( marked as primary email)

另一方面,我有几个其他人有2或3个电子邮件ID,但尚未分配主电子邮件_Id。

并且每次记录新电子邮件时,序列号都是根据日期0或1或2分配的。所以我试图找到表B中有电子邮件ID但未被指定为主要人员的列表ID尚未。

这就是我的尝试:

    select first_name, last_name    
    from table A     
     join table b    
    On a.ssn = b.ssn    
    and b.primary_email <> 'X'

我对此非常陌生,对于我可能犯过的任何错误,我表示歉意。

3 个答案:

答案 0 :(得分:0)

MySQL解决方案:

请使用子查询尝试以下解决方案。让我知道它是否有效。我没有数据可以验证。

SELECT 
    First_name, Last_name
FROM A
WHERE 
    A.ssn IN (  SELECT 
                    B.ssn
                FROM B
                GROUP BY B.ssn
                HAVING SUM(Primary_email = 'X') = 0); 

答案 1 :(得分:-1)

从你所说的,你可以改变和到哪里。您不希望有多个连接条件,但要限制连接发生的环境。

select first_name, last_name    
from table A     
 join table b    
On a.ssn = b.ssn    
WHERE b.primary_email <> 'X'

此外,如果未设置值,则可能必须检查NULL。

select first_name, last_name    
from table A     
 join table b    
On a.ssn = b.ssn    
WHERE b.primary_email IS NOT NULL

答案 2 :(得分:-1)

有几种不同的方法可以解决这个问题。它们都遵循相同的基本模式,即从完整列表中删除主电子邮件的所有用户。

示例数据

DECLARE @Sample TABLE
    (
        Id          INT,
        Email       VARCHAR(255),
        IsPrimary   BIT
    )
;

/* Populate table with sample data.
 * Id 1 has a primary email address.
 * Id 2 does not.
 */
INSERT INTO @Sample
    (
        Id,
        Email,
        IsPrimary
    )
VALUES
    (1, 'x@abc.com', 1),        -- Primary email address (ID 1).
    (1, 'x@def.com', 0),
    (1, 'x@ghi.com', 0),
    (2, 'y@abc.com', 0),
    (2, 'y@def.com', 0),
    (2, 'y@ghi.com', 0)
;

不在

-- Using NOT IN.
SELECT
    s.Id
FROM
    @Sample AS s
WHERE
    Id NOT IN
        (
            -- Return all ids with a primary email.
            SELECT 
                Id
            FROM
                @Sample
            WHERE
                IsPrimary = 1
            GROUP BY
                Id
        ) 
GROUP BY
    s.Id
;

<强>除非

    -- Full list.
    SELECT
        Id
    FROM
        @Sample
    GROUP BY
        Id

EXCEPT

    -- Exclude those with a primary.
    SELECT
        Id
    FROM
        @Sample
    WHERE
        IsPrimary = 1
    GROUP BY
        Id

有关更详细的说明以及其他几种方法,请参阅此blog post