Сохранить строку в таблице 1, если все значения существуют в таблице 2 - PullRequest
0 голосов
/ 25 мая 2019

У меня возникли проблемы с построением этого sql-запроса.

У меня есть одна таблица с городами Канады и Америки, подобная этой:

+-------------+------------------+
|start        |finish            |
+-------------+------------------+
|      Calgary|         Vancouver|
|     Edmonton|           Toronto|
|     Montreal|          New York|
|      Chicago|          St Louis|
|        Miami|          Winnipeg|
+-------------+------------------+

И у меня есть еще одна таблица только с городами Канады

+-------------+
|cities       |
+-------------+
|      Calgary|
|     Edmonton|
|     Montreal|
|    Vancouver|
|      Toronto|
|     Winnipeg|
+-------------+

И я хотел бы отфильтровать первую таблицу, чтобы сохранить только те строки, где ОБА start и finish существуют в таблице cities, например:

ВЫБОР ВЫБОРКИ:

+-------------+------------------+
|start        |finish            |
+-------------+------------------+
|      Calgary|         Vancouver|
|     Edmonton|           Toronto|
+-------------+------------------+

Моя первоначальная мысль заключалась в следующем:

SELECT *
FROM start_finish s, cities c
WHERE c.cities = s.start and c.cities = s.finish

Но после некоторых проб и ошибок я понимаю, что это вернет значения, только если начало и конец совпадают.

+-------------+------------------+
|start        |finish            |
+-------------+------------------+
|      Calgary|           Calgary|
+-------------+------------------+

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Вы можете использовать join или exists:

select sf.*
from start_finish sf
where exists (select 1 from cities c where c.city = sf.start
             ) and
      exists (select 1 from cities c where c.city = sf.finish
             ) ;
1 голос
/ 25 мая 2019

Внутреннее соединение дважды.Один раз для start, один раз для finish.

SELECT sf1.start,
       sf1.finish
       FROM start_finish sf1
            INNER JOIN cities c1
                       ON c1.cities = sf1.start
            INNER JOIN cities c2
                       ON c2.cities = sf1.finish;

дБ <> скрипка

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