Исключить контракты из запроса, если type_name недоступен - PullRequest
0 голосов
/ 10 июля 2020

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

Однако мне нужно вернуть ТОЛЬКО контракты, которые не имеют 3 type_name. Я хочу полностью исключить контракты с исключенным type_name.

SELECT DISTINCT cont.*
FROM contract cont
    ,contract_info_types type
    ,contract_info info 
WHERE cont.contract_id = info.doc_id
    AND info.type_id = type.type_id
    AND type.type_name NOT IN (
        'Contract_GIU_Code'
        ,'Contract_MUI_Code'
        ,'Contract_FOB_Code'
        )

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

вы можете использовать функцию sum windows следующим образом:

Select distinct <column_names> from
(SELECT cont.*, sum(case when type.type_name IN (
        'Contract_GIU_Code'
        ,'Contract_MUI_Code'
        ,'Contract_FOB_Code'
        ) then 1 else 0 end) over (partition by cont.contract_id) as sm
FROM contract cont
    ,contract_info_types type
    ,contract_info info 
WHERE cont.contract_id = info.doc_id
    AND info.type_id = type.type_id)
Where sm = 0
0 голосов
/ 10 июля 2020

Научитесь использовать правильный, явный, стандартный , читаемый JOIN синтаксис.

В этом случае я бы рекомендовал NOT EXISTS:

SELECT c.*
FROM contract c
WHERE NOT EXISTS (SELECT 1 
                  FROM contract_info_types cit JOIN
                       contract_info i 
                       ON cit.type_id = t.type_id
                  WHERE c.contract_id = i.doc_id AND
                        cit.type_name IN ('Contract_GIU_Code', 'Contract_MUI_Code', 'Contract_FOB_Code')
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...