JOIN ON条款中,OR是如何工作的?我有一个包含winner_idopponent_id列的表games和一个包含team_id列和名称列的teams表.opponent_idwinner_id都是指team_id中的一支球队,我需要它来获得name支球队.

SELECT * 
FROM teams 
LEFT JOIN games ON teams.team_id = games.winner_id 
                OR teams.team_id = games.opponent_id

我认为OR表示如果操作数的左或右表达式的计算结果为真,则插入数据.但这样做的目的是为winner_idopponent_id创建单独的行,而不是所有行上的所有行?

我的预期结果是,它将在winner_id上联接,因为它是第一个表达式,并且只获得获胜者的名称,而忽略ative_id,因为第一个表达式为真?

这是我得到的结果:

team_id name game_id year round winner_id opponent_id winner_goals opponent_goals
393 France 97 2018 Final 393 394 4 2
393 France 100 2018 Semi-Final 393 395 1 0
393 France 104 2018 Quarter-Final 393 400 2 0
393 France 112 2018 Eighth-Final 393 408 4 3
393 France 120 2014 Quarter-Final 409 393 1 0
393 France 123 2014 Eighth-Final 393 413 2 0
394 Croatia 97 2018 Final 393 394 4 2
394 Croatia 99 2018 Semi-Final 394 396 2 1
394 Croatia 101 2018 Quarter-Final 394 397 3 2
394 Croatia 109 2018 Eighth-Final 394 405 2 1
395 Belgium 98 2018 Third Place 395 396 2 0
395 Belgium 100 2018 Semi-Final 393 395 1 0

和我的团队坐在桌子上

                              Table "public.teams"
 Column  |  Type   | Collation | Nullable |                Default                 
---------+---------+-----------+----------+----------------------------------------
 team_id | integer |           | not null | nextval('teams_team_id_seq'::regclass)
 name    | text    |           | not null | 
Indexes:
    "teams_pkey" PRIMARY KEY, btree (team_id)
    "teams_name_key" UNIQUE CONSTRAINT, btree (name)
Referenced by:
    TABLE "games" CONSTRAINT "games_opponent_id_fkey" FOREIGN KEY (opponent_id) REFERENCES teams(team_id)
    TABLE "games" CONSTRAINT "games_winner_id_fkey" FOREIGN KEY (winner_id) REFERENCES teams(team_id)

还有我的游戏桌

                                          Table "public.games"
     Column     |         Type          | Collation | Nullable |                Default                 
----------------+-----------------------+-----------+----------+----------------------------------------
 game_id        | integer               |           | not null | nextval('games_game_id_seq'::regclass)
 year           | integer               |           | not null | 
 round          | character varying(20) |           | not null | 
 winner_id      | integer               |           | not null | 
 opponent_id    | integer               |           | not null | 
 winner_goals   | integer               |           | not null | 
 opponent_goals | integer               |           | not null | 
Indexes:
    "games_pkey" PRIMARY KEY, btree (game_id)
Foreign-key constraints:
    "games_opponent_id_fkey" FOREIGN KEY (opponent_id) REFERENCES teams(team_id)
    "games_winner_id_fkey" FOREIGN KEY (winner_id) REFERENCES teams(team_id)

推荐答案

在SQL中,当您如前所述在JOIN ON子句中使用OR运算符时,它将 for each 匹配条件创建单独的行.这种行为完全在意料之中.Teams表中的每一行都将与Games表中的行连接起来,在该表中,Teams.Team_id=games.winner_id或Teams.Team_id=Games.opposer_id的计算结果为True.这意味着,如果每支队伍在多场比赛中是赢家或对手,你就会得到多行.

如果您希望在一行中同时获得获胜团队和对手团队的名称,则需要执行两个单独的联接,每个条件一个:

SELECT 
    games.game_id,
    teams_winning.name AS winning_team,
    teams_opponent.name AS opponent_team
FROM games
LEFT JOIN teams AS teams_winning ON games.winner_id = teams_winning.team_id
LEFT JOIN teams AS teams_opponent ON games.opponent_id = teams_opponent.team_id;

Sql相关问答推荐

获取家谱树中第一次出现的特定信息,然后停止

SUM(条件)在Oracle?

如何退回当年的所有参赛作品?""

我可以将INSERT语句与SELECT一起使用来创建条件吗?

从依赖于其他表的值的XREF表中的值分组获得正确的计数?

对表进行多项 Select 以返回最大值和时间

对多个条件的SQL进行排名

基于另一个(SAS、SQL)中的值更新列

在UNION查询中查找MIN

SQL按组 Select 最小值,当值不存在时为Null

将最近的结束日期与开始日期相匹配

如何在 postgres 中旋转某些数据字段

正则表达式:停在第一个匹配的其中一个字符位置上

强制 SQL 始终通过 R 从视图中返回至少一行

多列上的 SQL UNIQUE 约束 - 它们的组合必须是唯一的还是至少其中之一?

如何在 RavenDB Studio (RQL) 中插入更新文档

如何使用 pg-promise 创建要在复杂的 sql 查询中使用的 VALUES 列表?

snowfalke 会在 Select 运行时锁定表吗?

在时态表和非时态表之间使用 EXCEPT 的 SQL 子查询给出表达式错误数

postgreSQL 中的循环表