没有特定列的记录时过滤带关系的SELECT TOP

时间:2018-11-27 23:25:39

标签: sql sql-server tsql join

问题:如何过滤结果(如下所示)以排除错误数据?我猜我的问题出在WHERE子句中,但我一生都无法解决。

最终目标:为CDA_Orientationportfolio表中不存在任何值的e_component列返回NULL值(例如,员工尚未接受“入职培训” )

数据库架构: Database Schema

结果集有错误: Results with Errors

注意::伊士曼(Eastman),德卢卡(DeLuca)和方塔诺(Fontano)的入学日期是相同的日期,代表course_startdate表的portfolio列中的TOP 1结果。 / p>

我希望结果看起来像什么 Desired Result Set

如果我正确完成了 JOINS ,则CDA_Orientation列应显示 NULL ,因为portfolio表中没有任何条目(因此,这三个人的e_component表)。仅当员工分配给课程时,该条目才由前端创建

这是我的代码:

SELECT TOP (1) WITH TIES
    P.lastname+', '+P.firstname AS Employee,
    P.person_id,
    CONVERT(DATE,PC.CDAI_EXP_DATE) AS CDA_Infant,
    CONVERT(DATE,PC.CDAP_EXP_DATE) AS CDA_Preschool,
    CONVERT(DATE,PO.course_startdate) AS CDA_Orientation

FROM person P
    JOIN person_custom PC ON PC.person_id=P.person_id
    LEFT JOIN portfolio PO ON P.person_id=PO.person_id
    FULL JOIN e_component EC ON PO.component_id=EC.component_id

WHERE (cdai_exp_date IS NOT NULL OR cdap_exp_date IS NOT NULL)
    AND PO.course_startdate IN (SELECT course_startdate
        FROM portfolio PO
        LEFT JOIN e_component EC ON PO.component_id=EC.component_id
        WHERE (EC.userdefined_id LIKE '000150%' AND PO.status=11))

ORDER BY ROW_NUMBER() OVER(PARTITION BY P.lastname+', '+P.firstname 
    ORDER BY PO.person_id)

注意: TOP (1) WITH TIES已成功从portfolio表中提取了Tarkin和Rust的最新入职日期(员工可以有多个)。我已经删除了所有不必要的 JOINS 和警告。

谢谢!

1 个答案:

答案 0 :(得分:1)

我相信加入是问题。如果您只是想为每个人获取记录,以这种方式使用WITH TIES也会使您感到困惑;我会使用GROUP BY。如果您想在没有子查询的情况下执行此操作,则可以:

SELECT
    P.lastname+', '+P.firstname AS Employee,
    P.person_id,
    CONVERT(DATE,PC.CDAI_EXP_DATE) AS CDA_Infant,
    CONVERT(DATE,PC.CDAP_EXP_DATE) AS CDA_Preschool,
    MAX(CONVERT(DATE,PO.course_startdate)) AS CDA_Orientation
FROM @person P
JOIN @person_custom PC 
ON PC.person_id=P.person_id
LEFT JOIN 
    (@portfolio PO 
    JOIN @e_component EC 
    ON PO.component_id=EC.component_id
        AND EC.userdefined_id LIKE '000150%' 
        AND PO.status=11)
ON P.person_id=PO.person_id
WHERE (cdai_exp_date IS NOT NULL OR cdap_exp_date IS NOT NULL)
GROUP BY P.lastname, P.firstname, P.person_id,PC.CDAI_EXP_DATE,PC.CDAP_EXP_DATE