簡體   English   中英

如何查詢兩個表並從第一個表返回所有記錄,而不管第二個表中是否存在

[英]How to query two tables and return all records from first, regardless on whether exist in the second table

我有幾個具有以下結構的表:

表格應用:

AppId   Name
====================
1       App 01
2       App 02
3       App 03

表訂閱的應用程序

SubAppId   AppId    SubId
==============================
1          1        99901

我需要獲取的是具有所有SubscribedApplications匹配項的表應用程序,如果其中沒有記錄,則獲取空值,並按SubId進行過濾。 像這樣:

預期結果:

AppId   Name    SubAppId   SubId
==================================
1       App 01  1          99901
2       App 02  NULL       NULL
3       App 03  NULL       NULL

我想到這樣做一個正確的外部聯接:

select Applications.AppId as AppId,     
    Applications.Name as AppName,         
    SubscribedApplications.SubAppId as SubAppId,     
    SubscribedApplications.SubId as SubId,       
from SubscribedApplications 
    right outer join Applications on Applications.AppId = SubscribedApplications.AppId
where SubscribedApplications.SubId is null
    or SubscribedApplications.SubId= '99901' 

但是,這種方法不起作用。 如果我在subsubscribed應用程序中創建一個記錄(例如,子ID 99901),則會得到三個記錄,但是如果我查詢到99902,則只會得到兩個記錄。 我不知道為什么。 我嘗試了幾種變體,包括在where子句中使用in(null,'99901'),無濟於事。

我的另一種選擇是從Application表中檢索所有記錄,然后從SubscribedApplication記錄和(C#)代碼中的記錄評估要保留的記錄,但如果可能的話,我希望將其保存在一個查詢中。

像下面這樣用JOIN移動您的條件。

SELECT a.AppId     AS AppId, 
       a.Name      AS AppName, 
       s.SubAppId  AS SubAppId, 
       s.SubId     AS SubId, 
FROM   SubscribedApplications  s 
       RIGHT OUTER JOIN Applications  a 
                     ON a.AppId  = s.AppId  
                        AND s.SubId = 99901 

注意:作為最佳實踐,您應該為表使用別名。 我已經通過添加別名來修改您的查詢。

我將其寫為左聯接:

SELECT
    a.AppId,
    a.Name,
    sa.SubAppId,
    sa.SubId
FROM application a
LEFT JOIN SubscribedApplications sa
    ON a.AppId = sa.AppId;

在此處輸入圖片說明

演示

使用左聯接

  Select a.*,sub.* from application a left  join 
  subscribeapplication sub a.applid=sub.appid and 
  sub.subid=99901

為了獲得外部聯接的優勢,您需要將where子句條件移到on子句中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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