![](/img/trans.png)
[英]Join two tables on multiple columns and return only records from first table that are not in the second
[英]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.