Как естественное объединение и затем выбор из этой таблицы в 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 из домашнего и выездного матчей.) СОЮЗ РАЗЛИЧАЕТ два набора.