Как переписать подзапрос с помощью объединения

#sql

#sql

Вопрос:

Эйхо, мне нужно переписать следующий код без использования подзапроса:

 SELECT country, region, name
FROM wcities
WHERE( country, region ) NOT IN ( SELECT country, code FROM regions )
AND country = 'IT'
AND region is NOT NULL;
 

Я попробовал это с:

 select c.country, c.region, c.name
from wcities c
join regions r on c.country <> r.country AND c.region <> r.code
where c.country = 'IT' 
AND c.region is NOT NULL;
 

Я понимаю, почему это не работает, но я не вижу, что мне нужно для этого.

Заранее спасибо 🙂

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

1. Я также рекомендую NOT EXISTS более LEFT JOIN / IS NULL

Ответ №1:

В качестве left join это было бы:

 SELECT c.country, c.region, c.name
FROM wcities c LEFT JOIN
     regions r
     ON r.country = c.country and r.region = c.region
WHERE r.country IS NULL AND
      c.country = 'IT' AND
      c.region is NOT NULL;
 

Тем не менее, я бы рекомендовал NOT EXISTS для этой цели:

 SELECT c.country, c.region, c.name
FROM wcities c         
WHERE NOT EXISTS (SELECT 1
                  FROM regions r
                  WHERE r.country = c.country and r.region = c.region
                 ) AND
      c.country = 'IT' AND
      c.region is NOT NULL;
 

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

1. Вы не могли бы привести NOT EXISTS пример?