Почему внутренние объединения иногда приводят к перекрестным соединениям? - PullRequest
0 голосов
/ 07 октября 2018

Я использую Oracle v11.2 с sqlplus.

У меня есть таблица, в которой указано время прохождения дорожной команды средней школы.Таблица:

                                  track.laptimes

Name                                                  Null?    Type
----------------------------------------------------- -------- ----------------
MATCHID                                                NOT NULL NUMBER(10)
PLAYERID                                              NOT NULL NUMBER(10)
LAP                                                   NOT NULL NUMBER(10)
POSITION                                                       NUMBER(10)

Я пытаюсь вернуть одну таблицу с 3 столбцами, кругом и позицией первого (майка) и второго победителя (боб) для конкретного matchID, который имеет20 кругов.Для примера мы можем жестко кодировать, первое место будет

PLAYERID=1 as mike

, а второе -

PLAYERID=2 as bob

Ожидаемый результат при запросе matchID = 1 будет

     lap          mikePos        bobPos                                    
    ------------ -------- -------------------
     1             3                7
     2             2                4
     ........
     20            1                2

Я могу получить половину запроса без проблем

SELECT laptimes.lap, laptimes.position AS mikePos
FROM track.laptimes
WHERE matchID=1 AND playerID=1;

Это приводит к более чем 20 строкам и не имеет соответствующего 3-го столбца.

Проблема возникает, когда я пытаюсьдобавьте еще один столбец к этому выводу для позиции боба в том же матче и для того же круга.Как мне подойти к этому?Я пытался выполнить INNER JOIN и использовать предложение WITH, но в результате CROSS JOIN дает 400 строк вместо желаемых 20. Может ли кто-нибудь указать мне правильное направление, как я мог бы структурировать этот запрос?

Я думал о том, чтобы иметь две таблицы, аналогичные приведенному выше запросу, но одну для mike и одну для bob, а затем соединить их обратно с таблицей track.laptimes и выбрать колени, mikePos и ​​bobPos, но мне не повезло сделать это таким образом ивсегда приводит к CROSS JOIN.

Я не ищу ответа, просто точка в правильном направлении, спасибо!

1 Ответ

0 голосов
/ 07 октября 2018

Вам необходимо присоединиться к matchid, коленям и игроку, предполагая, что matchid и playerid и колени являются первичными ключами.

SELECT a.lap, a.position AS mikePos, b.position as bobpos
FROM track.laptimes a
    inner join track.laptimes b on a.matchid=b.matchid and b.playerid=2 and a.lap=b.lap
WHERE a.matchid=1 AND a.playerID=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...