如何 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
或者您可以从六种不同的技术中选择另一种。
我想 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
或者您可以从六种不同的技术中选择另一种。