如何 select 与带条件的联合结果不同

How to select distinct from union result with condition

我想 select 不同的供应商与 chase 如果有两个供应商有状态寄存器并且没有注册那么选择的是有状态寄存器的供应商但是如果只有一个供应商然后 select 它,

我正在使用 sql 服务器 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

您可以使用行号和案例语句获得预期的输出。如果您注册了两个,那么您可以使用排名,否则如果您只想为每个供应商 ID 一行,则可以使用行号。

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 
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

这里有多种可能性。

您可以将主查询作为结果查询的派生 table 来源

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

或者您可以从六种不同的技术中选择另一种。