SQL Self Join таблица - все записи из 1 таблицы, 1 запись из другой - PullRequest
1 голос
/ 19 марта 2019

У меня есть таблица, которая выглядит следующим образом (в MS Access)

rDate      |  rTime  |  Horse  |  Pos  |  Odds
------------------------------------------
01/03/2019 |  13:00  |  HorseA |   3   |  13.2
01/03/2019 |  13:00  |  HorseB |   2   |  3.2
01/03/2019 |  13:00  |  HorseC |   1   |  2.0
01/03/2019 |  13:00  |  HorseD |   4   |  30.0
01/03/2019 |  14:30  |  HorseA |   4   |  6.6
01/03/2019 |  14:30  |  HorseB |   3   |  2.7
01/03/2019 |  14:30  |  HorseC |   2   |  15.0
01/03/2019 |  14:30  |  HorseD |   1   |  8.6
etc...

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

rDate      |  rTime  |  Horse  |  Pos  |  Odds  |  OddsOfWinner
----------------------------------------------------------------
01/03/2019 |  13:00  |  HorseA |   3   |  13.2  |    2.0
01/03/2019 |  13:00  |  HorseB |   2   |  3.2   |    2.0
01/03/2019 |  13:00  |  HorseC |   1   |  2.0   |    2.0
01/03/2019 |  13:00  |  HorseD |   4   |  30.0  |    2.0
01/03/2019 |  14:30  |  HorseA |   4   |  6.6   |    8.6
01/03/2019 |  14:30  |  HorseB |   3   |  2.7   |    8.6
01/03/2019 |  14:30  |  HorseC |   2   |  15.0  |    8.6
01/03/2019 |  14:30  |  HorseD |   1   |  8.6   |    8.6
etc...

Пока я пробовал следующие запросы, но ни один из них не работает, как ожидалось, я уверен, что один из них нуждается только в небольшой настройке где-то:

SELECT A.*, B.Odds FROM Results A
INNER JOIN (SELECT ODDS FROM Results B WHERE A.rDate = B.rDate AND Pos = 1) 
AS temp
ON A.rDate = B.rDate AND A.rTime = B.rTime
WHERE A.rDate >= #2018/01/01#;

----------------------------------------------------------------------

SELECT A.*, B.Odds
FROM Results A, Results B
WHERE A.rDate = B.rDate AND A.rTime = B.rTime
AND A.rDate >= #2018/01/01#;

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Вы также можете использовать inner join следующим образом:

select 
    r1.*, q.wodds
from 
    results r1 inner join
    (select r2.rdate, r2.rtime, r2.odds as wodds from results r2 where r2.pos = 1) q 
    on r1.rdate = q.rdate and r1.rtime = q.rtime
where 
    r1.rdate >= #2018/01/01#

Объединения обычно более эффективны, чем коррелированные подзапросы, поскольку подзапрос должен оцениваться для каждой записи в наборе данных.

1 голос
/ 19 марта 2019

Для этого можно использовать коррелированный подзапрос:

select r.*,
       (select r2.odds
        from results as r2
        where r2.rdate = r.rdate and r2.rtime = r.time and
              r2.pos = 1
       ) as winning_odds
from results as r;

Для производительности просто добавьте индекс results(rdate, rtime, pos, odds).

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