[英]SQL using NOT EXISTS and LEFT OUTER JOIN
我必須過濾主表[Reports]上的某些記錄,以匹配表名[InsurancePlan]中的值。
在報告中,我有一個列名:代碼。 代碼的值為1,2,3。 我只想將以下書面語法應用於Code = 1,2,如果code = 3,則不要對其進行過濾。
Select *
from Reports rpt
Left join InsurancePlan Ip
on IP.PlanName = rpt.PlanId
Where rpt.[Account] = 'Pharmacy'
and Ip.PlanName is null
select *
from reports rpt
where rpt.[Account] like 'Pharmacy'
AND NOT EXISTS(Select 1
from dbo.InsurancePlan IP
WHERE [rpt].[PlanId] = IP.PlanName
)
兩種語法都返回相同的輸出。
如何通過編寫代碼= 1,2的篩選來重寫查詢
Select * from Reports rpt
Left join InsurancePlan Ip
on IP.PlanName = rpt.PlanId
Where rpt.[Account] = 'Pharmacy'
and ((Ip.PlanName IS NULL) OR (Ip.PlanName IS NOT NULL AND rpt.Code =3))
或使用EXISTS運算子
select *
from reports rpt
where rpt.[Account] = 'Pharmacy'
AND rpt.Code = 3
AND EXISTS(Select 1
from dbo.InsurancePlan
WHERE [rpt].[PlanId] = PlanName
)
當您僅檢查表中記錄的存在而不從該表返回任何記錄時,EXISTS運算符是更好的選擇。
如果代碼值為3,則左聯接選項將帶出InsurancePlan表中的所有列。
如果代碼值為3且InsurancePlan表中有相應的記錄,則使用Exists運算符將僅從報表表中返回所有列。
或者從兩個表返回結果的另一種選擇是
Select * from Reports rpt
Left join InsurancePlan Ip
on IP.PlanName = rpt.PlanId AND rpt.Code =3 --<-- specify in JOIN Condition
Where rpt.[Account] = 'Pharmacy'
嘗試這個:
select * from Reports rpt
left join InsurancePlan Ip
on IP.PlanName = rpt.PlanId
Where rpt.[Account] = 'Pharmacy'
and (rpt.Code = 3 or Ip.PlanName is null)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.