Как запросить две таблицы и вернуть все записи из первой, независимо от того, есть ли во второй таблице - PullRequest
0 голосов
/ 28 марта 2019

У меня есть пара таблиц со следующей структурой:

Таблица применения:

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

Таблица подписных приложений

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

Мне нужно получить табличное приложение со всеми совпадениями SubscribeedApplications, и, если в нем нет записи, получить нулевые значения, отфильтрованные по 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' 

Однако этот подход не работает. Если я создаю запись в подписанных приложениях, скажем, для subid 99901, я получаю три записи, но если я запрашиваю 99902, я получаю только две записи. Я не могу понять почему. Я пробовал несколько вариантов этого, в том числе использование in (null, '99901') в предложении where, но безрезультатно.

Моя другая альтернатива - извлечь все записи из таблицы приложения, затем записи из записи SubscribeedApplication и в коде (C #) оценить, какие из них сохранить, но я бы хотел, чтобы это было в одном запросе, если это возможно.

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Переместите ваше условие "где" с помощью 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 

Примечание: Рекомендуется использовать псевдоним для своей таблицы. Я изменил ваш запрос, добавив псевдоним.

1 голос
/ 28 марта 2019

Я бы написал это как левое соединение:

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

Демо

0 голосов
/ 28 марта 2019

Использовать левое соединение

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

Чтобы получить преимущество внешнего соединения, вам нужно переместиться туда, где условие условия входит в предложение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...