2016-02-19 85 views
1
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  
[email protected],  
[email protected] (marked as primary email) 

我有几个其他人的名单拥有2或3个电子邮件ID并且尚未分配主要email_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' 

我很新的这一点,我对任何错误道歉,我可能已经取得。

+0

请告诉我你不是真的使用SSN作为你的表的主键吗?这是应该随时加密的敏感信息。至于你的实际问题,我不知道你在问什么。你是否想找到没有至少一个主要电子邮件的SSN?有超过1个主要电子邮件怎么样?你有办法阻止吗? –

+0

你真的应该决定你正在使用哪个DBMS。 mysql <> sql服务器。 –

+0

您应该考虑将Primary_Email更改为不可空的BIT字段。如果一个字段最终可以保存两个以上的值。这导致错过的记录(其中主要不等于X,但其他的代替)。 –

回答

-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 
+0

嗨罗伯特,但我想获得其primary_email一直为null的人的列表。例如,我可能会有几封电子邮件,其中一封电子邮件可能被标记为X,但我正在寻找那些从未标记过电子邮件的人群。 – Khatra

+0

我确实按照几个步骤运行查询,查找主电子邮件为X的人数,然后运行下一个查询找到的人数,该人数与前一个列表中没有X的人数比运行更新查询我得到了我正在寻找的东西。谢谢大家的反馈。 – Khatra

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); 
+0

只需稍作更改即可适用于SQL Server。 HAVING子句将读取* COUNT(CASE WHEN Primary_Email ='X'THEN 1 ELSE NULL END)= 0 *。当然,如果你只需要SSN,你也可以自己运行子查询。 –

-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, '[email protected]', 1),  -- Primary email address (ID 1). 
    (1, '[email protected]', 0), 
    (1, '[email protected]', 0), 
    (2, '[email protected]', 0), 
    (2, '[email protected]', 0), 
    (2, '[email protected]', 0) 
; 

NOT IN

-- 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