如何查询两个表并从第一个表返回所有记录,而不管第二个表中是否存在

时间:2019-03-28 04:56:43

标签: sql sql-server

我有几个具有以下结构的表:

表格应用程序:

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#)代码中的记录评估要保留的记录,但如果可能的话,我希望将其保存在一个查询中。

3 个答案:

答案 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;

enter image description here

Demo

答案 2 :(得分:0)

使用左联接

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

要利用外部联接的优势,您需要将where子句条件移至on子句