Как выбрать отличный от результата объединения с условием - PullRequest
0 голосов
/ 10 мая 2019

Я хочу выбрать отдельного поставщика с чейзом, если есть два поставщика с регистром состояния, но не зарегистрирован, тогда выбранным является поставщик с регистром состояния, но если только один поставщик, то просто выберите его,

Яиспользуя sql server 2017

SELECT
 pv.vendor_id,pv.vendor_name,'Not Registered' as registration_status
    FROM 
        proposal_vendor as pv
    UNION
SELECT      bv.vendor_id,bv.vendor_name,bv.registration_status
    FROM 
        bidding_vendor as bv
    WHERE 
        bv.bidding_header_id = 97

48  vendor a               Register
48  vendor a           Not Registered   
4110    vendor b               Register
4110    vendor b               Not Registered   
4197    vendor c               Not Registered   

я ожидаю, что

48  vendor a        Register
4110    vendor b            Register
4197    vendor c        Not Registered

Ответы [ 3 ]

2 голосов
/ 10 мая 2019

Вы можете получить ожидаемый результат, используя номер строки и оператор case. Если у вас есть два зарегистрированных, то вы можете использовать ранг, иначе вы можете использовать номер строки, если вы хотите только одну строку на идентификатор поставщика.

select vendor_id, vendor_name, registration_status from  (
SELECT      bv.vendor_id,bv.vendor_name,bv.registration_status, row_number() over (partition by bv.vendor_id order by case when registration_status = 'Register' then 1 else 2) rownum 
    FROM 
        bidding_vendor as bv) t
where t.rownum = 1 
1 голос
/ 10 мая 2019

Здесь имеется несколько возможностей.

Вы можете сделать свой основной запрос источником производной таблицы для запроса результатов

SELECT pv.vendor_id, 
    pv.vendor_name, MAX(registration_status) as registration_status
FROM (
    SELECT
     pv.vendor_id,pv.vendor_name,'Not Registered' as registration_status
        FROM 
            proposal_vendor as pv
        UNION
    SELECT      bv.vendor_id,bv.vendor_name,bv.registration_status
        FROM 
            bidding_vendor as bv
        WHERE 
            bv.bidding_header_id = 97
    ) src

Вы можете использовать логику внешнего соединения

SELECT pv.vendor_id, 
    pv.vendor_name, 
    CASE WHEN bv.vendor_id is null
        THEN 'Not '
    END + 'Registered' as registration_status
FROM proposal_vendor as pv
FULL OUTER JOIN bidding_vendor as bv
    ON pv.vendor_id = bv.vendor_id
WHERE pv.vendor_id = 97
    OR bv.vendor_id = 97

Или вы можете выбрать другой из полдюжины различных техник.

1 голос
/ 10 мая 2019
SELECT pv.vendor_id,
       pv.vendor_name,
       'Not Registered' as registration_status
    FROM proposal_vendor as pv
    WHERE NOT EXISTS(SELECT 1
                         FROM bidding_vendor bv
                         WHERE bv.vendor_id = pv.vendor_id
                             AND bv.bidding_header_id = 97)
UNION ALL
SELECT bv.vendor_id,
       bv.vendor_name,
       bv.registration_status
    FROM bidding_vendor as bv
    WHERE bv.bidding_header_id = 97
...