sql - 您能否查看 SQL Server CTE 不起作用?
问题描述
我需要从数据库中提取电子邮件地址列表。这些电子邮件地址通过连接与 systemID 匹配,但是一个电子邮件地址(在表 A 中)可以对应于 1+ 个用户名(在表 B 中),并且每个用户名可以对应于一个 NULL systemID 或一个现有的 systemID。
我试图只提取具有 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 返回以下错误“无法绑定多部分标识的 List_NOTNULL_systemid.email”。请参阅粗体的 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)
List_NOTNULL_systemid
您使用已用 CTE 定义的别名这一事实并不意味着您可以直接引用它。您仍然必须将其包含在FROM
子句中:
With......
SELECT *
FROM List_NULL_systemid
WHERE Email2 NOT IN (select email1 from List_NOTNULL_systemid)
推荐阅读
- python - 海运折线图样式导致重复的图例条目
- r - 年度数据的圆形图
- visual-studio-code - 如何关闭 Markdown 文件的 VS Code 自动格式化?
- python-3.x - 如何删除字典 pandas env 列表中的键/值对
- tensorflow - 执行时是否使用 dropout 层权重?
- python-3.x - 如何使 ruamel.yaml 将格式化的 numpy 数组转储为简单列表
- python - 我不知道为什么我把它作为我的输出?
- python - 字母总是被检测为大写,即使它们是小写
- opengl - GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 尝试创建多重采样帧缓冲区
- python - 如何检查列表的每个字符是否在字符串中?