首页 > 解决方案 > 您能否查看 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)

请帮忙!谢谢!

标签: sqlsql-serverssms

解决方案


这是错误: 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)

推荐阅读