为什么内部联接有时会导致交叉联接?

时间:2018-10-06 21:07:14

标签: sql oracle

我正在将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)

我正在尝试为一个具有20圈的特定matchID返回一个包含3列,圈数以及第一名(迈克)和第二名获胜者(bob)的位置的表格。对于本示例,我们可以将第一个硬编码为

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行,并且没有合适的第三列。

当我尝试在同一比赛中和同一圈中鲍勃的位置尝试向该输出添加另一列时,会出现问题。我应该如何处理?我试着做一个INNER JOIN并使用WITH子句,但是我不断导致CROSS JOIN给我400行而不是所需的20行。有人可以向我指出如何构造此查询的正确方向吗?

我的想法是要有两个与上述查询类似的表,但一个用于mike,一个用于bob,然后将它们重新连接到tracks.laptimes表中,并选择lap,mikePos和bobPos,但是我这样做没有运气并总是导致交叉联接。

我不是在寻找正确方向的答案,谢谢!

1 个答案:

答案 0 :(得分:2)

您需要加入matchid,lap和玩家,假设matchid,playerid和lap是主键。

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