Проблема присоединения к SQL-серверу при фильтрации по столбцу свободного текста (vchar) - PullRequest
0 голосов
/ 22 мая 2019

Я застрял в представлении 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 связывается с тремя столбцами. Я ненавижу эту настройку, но, к сожалению, она находится вне моего контроля.

  • date_from_fx = DATETIME
  • date_to_fx = DATETIME
  • comment_fx = VCHAR 255

Он используется для записи даты контракта от и до даты, а также в виде произвольного текстового поля, которое может содержать что угодно. Примеры значений могут быть «CONAU SPP» или «CONSG ABC» и т. Д.

Однако я застрял в поле comment_fx выше.

Я специально хочу увидеть контракты, содержащие CONAU, или вернуть значение NULL, если у них нет значения, которое соответствует дате, или строки вообще нет. К сожалению, эта логика смешивается с любым другим контрактом, таким как "CONSG ABC". Независимо от того, к какому соединению я применяю, я либо вижу все ресурсы с требуемым контрактом, либо дублирую строки с нулевыми значениями и набором неприменимых контрактов. Я предполагаю, что упускаю что-то простое

В конечном итоге мне нужно составить список ресурсов, которые назначены проекту, но не имеют требуемого контракта (CONAU), этот список запустит другой процесс, который я уже разобрал.

Обновлен: Позвольте мне показать вам данные, которые возвращаются, если мы удалили таблицу resource_contracts, что вызвало мои проблемы: Результат данных

Извините, я не смог отформатировать таблицу во что-то, похожее на таблицу, чтобы вставить сюда.

Вот данные из таблицы контрактов: таблица договоров

Есть несколько вещей, которые я хочу здесь сделать, но я упросту это до одного. Я пытаюсь отправить параметр в запрос, например, «CONAU». Таким образом, он вернет все ресурсы, которые НЕ имеют допустимой строки, содержащей строку CONAU. Проблема в том, что они могут иметь другие строки, такие как CONSG, или вообще не иметь строк.

Во время моих попыток я часто получал неправильные строки для отображения, или при использовании ISNULL в части SELECT я получал нулевые строки и дублированные данные.

Условия могут быть изменены, но я пытаюсь научиться этому сам.

SQL скрипка тоже: http://sqlfiddle.com/#!18/7558f/2

1 Ответ

0 голосов
/ 22 мая 2019
WHERE
    asn.booking_project = '123456'
    AND con.comment_fx LIKE '%CONAU%'

В конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...