【问题标题】:How to select distinct from union result with condition如何选择与条件不同的联合结果
【发布时间】:2019-09-28 14:08:41
【问题描述】:

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

我使用的是 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

【问题讨论】:

    标签: sql-server select distinct union


    【解决方案1】:

    您可以使用行号和 case 语句获得预期的输出。如果您有两个注册,那么您可以使用排名,否则如果您希望每个供应商 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 
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        【解决方案3】:

        这里有多种可能性。

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

        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
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-01
          • 2017-07-13
          • 1970-01-01
          • 1970-01-01
          • 2019-01-28
          • 1970-01-01
          • 2016-02-26
          • 1970-01-01
          相关资源
          最近更新 更多