您能否查看 SQL 服务器 CTE 不工作?
Could you please review an SQL Server CTE not working?
我需要从数据库中提取电子邮件地址列表。这些电子邮件地址通过连接与 systemID 匹配,但是一个电子邮件地址(在 Table A 中)可以对应 1+ 个用户名(在 Table B 中)并且每个用户名可以对应一个 NULL systemID或现有的系统 ID。
我正在尝试仅提取具有 NULL systemID 且与任何 systemID 完全不匹配的电子邮件地址。
这是一个数据组合的例子:
电子邮件地址: aaa, bbb, ccc
用户名: aaa1, aaa2, bbb1, bbb2, bbb3, ccc1
aaa1 -> 链接到 sysID; aaa2 -> 未链接到 sysID;
bbb1 -> 链接到 sysID; bbb2 -> 链接到 sysID; bbb3 -> 未链接到 sysID;
ccc1 -> 未链接到 sysID
在这种情况下,我只想提取电子邮件地址“ccc”
我已经创建了两个 CTE 来拆分具有 NULL 和 NOT NULL systemID 的记录,现在我想获取一个 CTE(具有 NULL systemID)中的电子邮件不包含在另一个 CTE(具有 NOT)中的所有行NULL systemID),但我找不到办法做到这一点。 SSMS 返回以下错误“The multi-part identified List_NOTNULL_systemid.email could not be bound”。请参阅粗体的 SQL 语句。
这是我的尝试:
WITH List_NOTNULL_systemid AS
(
SELECT
h.email as Email1, h.[Employee First Name], h.[Employee Last Name],
a.fullusername, r.SystemId, h.[Op Company Desc]
FROM
HR_CONTRACTORS_COMBINED AS h
LEFT JOIN
AD_EMAIL_USERNAME_LINK AS a ON h.Email = a.mail
LEFT JOIN
RPT_USER_INFO AS r ON a.fullusername = r.fullusername
WHERE
h.email IS NOT NULL
AND r.systemid IS NOT NULL
),
List_NULL_systemid AS
(
SELECT
h.email AS Email2, h.[Employee First Name], h.[Employee Last Name],
a.fullusername, r.SystemId, h.[Op Company Desc]
FROM
HR_CONTRACTORS_COMBINED AS h
LEFT JOIN
AD_EMAIL_USERNAME_LINK AS a ON h.Email = a.mail
LEFT JOIN
RPT_USER_INFO AS r ON a.fullusername = r.fullusername
WHERE
h.email IS NOT NULL
AND r.systemid IS NULL
)
SELECT *
FROM List_NULL_systemid
WHERE Email2 NOT IN (List_NOTNULL_systemid.email1)
我也尝试了以下方法,但没有用:
SELECT * FROM List_NULL_systemid
WHERE Email2 NOT IN (email1)
请帮忙!谢谢!
错误如下:
WHERE Email2 NOT IN (List_NOTNULL_systemid.email1)
您使用 CTE 定义的别名 List_NOTNULL_systemid
这一事实 而不是 意味着您可以直接引用它。您仍然必须将其包含在 FROM
子句中:
With......
SELECT *
FROM List_NULL_systemid
WHERE Email2 NOT IN (select email1 from List_NOTNULL_systemid)
这是一种简单的方法:
SELECT
h.email AS Email2
, h.[Employee First Name]
, h.[Employee Last Name]
, a.fullusername
, h.[Op Company Desc]
FROM
HR_CONTRACTORS_COMBINED AS h
JOIN AD_EMAIL_USERNAME_LINK AS a
ON h.Email = a.mail
WHERE
NOT EXISTS
(
SELECT
1
FROM
RPT_USER_INFO AS r
WHERE
a.fullusername = r.fullusername
AND r.SystemId IS NOT NULL
);
我需要从数据库中提取电子邮件地址列表。这些电子邮件地址通过连接与 systemID 匹配,但是一个电子邮件地址(在 Table A 中)可以对应 1+ 个用户名(在 Table B 中)并且每个用户名可以对应一个 NULL systemID或现有的系统 ID。
我正在尝试仅提取具有 NULL systemID 且与任何 systemID 完全不匹配的电子邮件地址。
这是一个数据组合的例子:
电子邮件地址: aaa, bbb, ccc
用户名: aaa1, aaa2, bbb1, bbb2, bbb3, ccc1
aaa1 -> 链接到 sysID; aaa2 -> 未链接到 sysID;
bbb1 -> 链接到 sysID; bbb2 -> 链接到 sysID; bbb3 -> 未链接到 sysID;
ccc1 -> 未链接到 sysID
在这种情况下,我只想提取电子邮件地址“ccc”
我已经创建了两个 CTE 来拆分具有 NULL 和 NOT NULL systemID 的记录,现在我想获取一个 CTE(具有 NULL systemID)中的电子邮件不包含在另一个 CTE(具有 NOT)中的所有行NULL systemID),但我找不到办法做到这一点。 SSMS 返回以下错误“The multi-part identified List_NOTNULL_systemid.email could not be bound”。请参阅粗体的 SQL 语句。
这是我的尝试:
WITH List_NOTNULL_systemid AS
(
SELECT
h.email as Email1, h.[Employee First Name], h.[Employee Last Name],
a.fullusername, r.SystemId, h.[Op Company Desc]
FROM
HR_CONTRACTORS_COMBINED AS h
LEFT JOIN
AD_EMAIL_USERNAME_LINK AS a ON h.Email = a.mail
LEFT JOIN
RPT_USER_INFO AS r ON a.fullusername = r.fullusername
WHERE
h.email IS NOT NULL
AND r.systemid IS NOT NULL
),
List_NULL_systemid AS
(
SELECT
h.email AS Email2, h.[Employee First Name], h.[Employee Last Name],
a.fullusername, r.SystemId, h.[Op Company Desc]
FROM
HR_CONTRACTORS_COMBINED AS h
LEFT JOIN
AD_EMAIL_USERNAME_LINK AS a ON h.Email = a.mail
LEFT JOIN
RPT_USER_INFO AS r ON a.fullusername = r.fullusername
WHERE
h.email IS NOT NULL
AND r.systemid IS NULL
)
SELECT *
FROM List_NULL_systemid
WHERE Email2 NOT IN (List_NOTNULL_systemid.email1)
我也尝试了以下方法,但没有用:
SELECT * FROM List_NULL_systemid
WHERE Email2 NOT IN (email1)
请帮忙!谢谢!
错误如下:
WHERE Email2 NOT IN (List_NOTNULL_systemid.email1)
您使用 CTE 定义的别名 List_NOTNULL_systemid
这一事实 而不是 意味着您可以直接引用它。您仍然必须将其包含在 FROM
子句中:
With......
SELECT *
FROM List_NULL_systemid
WHERE Email2 NOT IN (select email1 from List_NOTNULL_systemid)
这是一种简单的方法:
SELECT
h.email AS Email2
, h.[Employee First Name]
, h.[Employee Last Name]
, a.fullusername
, h.[Op Company Desc]
FROM
HR_CONTRACTORS_COMBINED AS h
JOIN AD_EMAIL_USERNAME_LINK AS a
ON h.Email = a.mail
WHERE
NOT EXISTS
(
SELECT
1
FROM
RPT_USER_INFO AS r
WHERE
a.fullusername = r.fullusername
AND r.SystemId IS NOT NULL
);