簡體   English   中英

使用NOT EXISTS和LEFT OUTER JOIN的SQL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM