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'
我对此非常陌生,对于我可能犯过的任何错误,我表示歉意。
答案 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。