我有几个具有以下结构的表:
表格应用程序:
AppId Name
====================
1 App 01
2 App 02
3 App 03
表SubscribedApplications
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'),无济于事。
我的另一种选择是从“应用程序”表中检索所有记录,然后从“ SubscribedApplication”记录和(C#)代码中的记录评估要保留的记录,但如果可能的话,我希望将其保存在一个查询中。
答案 0 :(得分:2)
使用JOIN
移动您的where条件,如下所示。
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
注意:作为最佳做法,您应该为表使用别名。我已经通过添加别名来修改您的查询。
答案 1 :(得分:1)
我将其写为左联接:
SELECT
a.AppId,
a.Name,
sa.SubAppId,
sa.SubId
FROM application a
LEFT JOIN SubscribedApplications sa
ON a.AppId = sa.AppId;
答案 2 :(得分:0)
使用左联接
Select a.*,sub.* from application a left join
subscribeapplication sub a.applid=sub.appid and
sub.subid=99901
要利用外部联接的优势,您需要将where子句条件移至on子句