Как естественное объединение и затем выбор из этой таблицы в SQL Oracle

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

 Table1(tid, p_name, country)
 Table2(pid1, pid2, match_start, goals1, goals2)

Где я вставил несколько случайных значений.

Найдите имена всех игроков из Боливии, которые играли против игрока из Индии. Убедитесь, что повторяющиеся имена не возвращаются.

Я думал сделать так:

SELECT DISTINCT p_name
FROM Table1 NATURAL JOIN Table2
WHERE (
         (Table1.tid = Table2.pid1 or 
          Table1.tid = Table2.pid2 and 
           Table1.country = 'India') and 
       Table1.country = 'Bolivia')

И я получаю стол со всеми p_names, которые связаны со страной Боливия, но я не могу дать мне игроков, которые ТОЛЬКО игрались против игрока из Индии. Я не хочу игроков, которые не играли против Индии

Может ли кто-нибудь помочь мне решить мою проблему? Я совершенно не прав?

3 ответа

Вот несколько иной подход.

Получите две копии Таблицы 1, одну для Боливии, одну для Индии. Затем отфильтруйте Боливию дома до Индии (B.tid = pid1 и I.tid = pid2) или от Боливии до Индии (B.tid = pid2 и I.tid = pid1). Проект на Боливии p_name:

SELECT DISTINCT B.p_name
FROM Table1 B, Table2, Table1 I
WHERE B.country = 'Bolivia'
  AND I.country = 'India'
  AND (   (B.tid = pid1 AND I.tid = pid2)
       OR (B.tid = pid2 AND I.tid = pid1)
      )

Я бы построил это с помощью коррелированного подзапроса EXISTS, потому что на самом деле вам нужен список игроков, для которых страна "Боливия", для которой существует матч против команды "Индия".

Ваша модель данных мне не ясна, и она, вероятно, упрощена, так как я ожидаю увидеть таблицу для команд, таблицу для игроков, таблицу для матчей и таблицу для роли, которую играл каждый игрок совпадение ("сыграно", "заменено не использовано", "заменено использовано" и тому подобное).

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

Да, вы совершенно не правы.

ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ не имеет смысла: между таблицами 1 и 2 нет общих имен столбцов, как усомнился Руудван. Вы могли бы также иметь

ИЗ таблицы 1, таблицы 2 ГДЕ...

Чтобы решить эту проблему, вам необходимо получить две копии Таблицы 1 - одну для домашней команды (с tid = pid1), одну для выездной команды (с tid = pid2). Затем отфильтруйте матчи Боливия дома до Индии ИЛИ Индия дома до Боливии. Тогда проект p_name от боливийских команд. (Это будет два набора p_name из домашнего и выездного матчей.) СОЮЗ РАЗЛИЧАЕТ два набора.

Другие вопросы по тегам