Как проверить, есть ли связанная строка, а также отсутствующая строка

#sql #oracle #compare

#sql #Oracle #Сравнить

Вопрос:

Я приношу извинения за плохую формулировку названия моего вопроса. Я довольно новичок в SQL, и я не совсем уверен, как бы я назвал этот тип запроса сравнения.

У меня есть пара таблиц, и мне нужно запросить их, чтобы узнать, нет ли у кого-либо с учетной записью пользователя почтового адреса в файле. Адреса хранятся в одной таблице независимо от того, являются ли они почтовыми или физическими. Разница просто обозначается столбцом типа, который будет либо ‘M’, либо ‘P’. Таким образом, пользователи должны иметь 2 строки, связанные с ними, одна для их почтового адреса и одна для их физического адреса.

 //I want to do something like this
SELECT * FROM 
    USER
    , ADDR
WHERE USER.ADDR_ID =  ADDR.ID
AND ADDR.TYPE      = 'P'; 

SELECT * FROM 
    USER
    , ADDR
WHERE USER.ADDR_ID =  ADDR.ID
AND ADDR.TYPE      = 'M'; 
  

А затем найдите пользователей с одним адресом с типом = ‘P’, но без адреса с типом = ‘M’.

Ответ №1:

Вы можете использовать агрегацию или not exists :

 select u.*
from users u
where exists (select 1 from addr a where u.addr_id = a.id and a.type = 'P') and
      not exists (select 1 from addr a where u.addr_id = a.id and a.type = 'M')
  
  

Комментарии:

1. Также возможно левое внешнее соединение.