首页 > 解决方案 > 过滤自由文本 (vchar) 列时出现 SQL-Server 连接问题

问题描述

我被我试图创建的 SQL Server 视图所困扰。该视图返回分配给项目的资源列表以及一些其他详细信息,例如合同信息。尽管我遇到了 resource_contracts 表的问题,因为我一直在处理本质上是自由文本字段的内容。

SELECT DISTINCT
                CONCAT(RTRIM(res.first_name),' ', RTRIM(res.surname)) AS fullname ,
        res.main_res_id                                                           ,
        res.resource_id                                                           ,
        res.resource_typ                                                          ,
        res.status                                                                ,
        rel.rel_value                                                             ,
        asn.booking_project        AS project                                            ,
        asn.booking_project_descr  AS project_descr                                      ,
        asn.assignment_position    AS position                                           ,
        asn.date_from              AS commencement_date                                  ,
        DATEADD(DAY,1,asn.date_to) AS end_date                                           ,
        con.comment_fx
FROM resourcees res
INNER JOIN resource_relations rel
    ON
            res.main_res_id = rel.resource_id
    AND     rel.date_to    >= CAST(CURRENT_TIMESTAMP AS DATE)
    AND     res.client      = rel.client
LEFT OUTER JOIN resource_relations cc
    ON
            res.client      = cc.client
    AND     res.resource_id = cc.resource_id
    AND     cc.rel_attr_id  = 'C1'
    AND     res.date_to BETWEEN cc.date_from AND     cc.date_to
    AND     cc.status = 'N'
INNER JOIN relation_values ar2
    ON
            cc.rel_value = ar2.dim_value
    AND     ar2.client   = res.client
INNER JOIN assignments asn
    ON
            res.main_res_id = asn.resource_id
LEFT OUTER JOIN resource_contracts con
    ON
            con.dim_value     = res.main_res_id
    AND     res.client        = con.client
    AND     con.comment_fx LIKE '%CONAU%'
    AND     con.date_to_fx   >= asn.date_to
WHERE
        asn.booking_project = '123456'
ORDER BY
        fullname

我想上面看起来相当大。这是导致问题的最后一个连接以供参考。

resource_contracts 表联系三列。我讨厌这种设置,但不幸的是它超出了我的控制范围。

它用于记录合同的日期和日期,以及一个可以包含任何令人讨厌的内容的自由文本字段。样本值可能是“CONAU SPP”或“CONSG ABC”等。

但是,我被困在上面的 comment_fx 字段上。

我特别想查看包含 CONAU 的合同,或者如果它们没有满足日期要求的合同,或者根本没有一行,则返回 NULL 值。不幸的是,这种逻辑与他们拥有的任何其他合同(例如“CONSG ABC”)混淆了。无论我申请什么联接,我要么可以看到所需合同的所有资源,要么可以复制具有空值的行和非适用的合同。我想我错过了一些简单的东西

最终,我需要生成分配给项目但没有所需合同 (CONAU) 的资源列表,该列表将触发我已经整理好的另一个流程。

更新: 让我向您展示如果我们删除导致我的问题的 resource_contracts 表返回的数据: 数据结果

抱歉,我无法将表格格式化为类似于表格的内容以粘贴到此处。

这是来自contracts表的数据: contracts table

我想在这里做很多事情,但我会把它简化成一个。我正在尝试向查询发送参数,例如“CONAU”。因此它将返回所有没有包含字符串 CONAU 的有效行的资源。问题是,它们可能有其他行,如 CONSG,或者根本没有行。

在我的尝试中,我经常会显示错误的行,或者在 SELECT 部分使用 ISNULL 时,我会得到空行和重复的数据。

条件可能会颠倒,但我正在尝试自己学习这一点。

SQL小提琴也是:http ://sqlfiddle.com/#!18/7558f/2

标签: sql-server

解决方案


WHERE
    asn.booking_project = '123456'
    AND con.comment_fx LIKE '%CONAU%'

到尾声。


推荐阅读