PL / SQL Попытка отобразить tableID как имя другой таблицы - PullRequest
2 голосов
/ 06 февраля 2020

Я создаю базу данных НХЛ oracle sql. Я пытаюсь создать запрос SELECT, в котором он показывает homeTeam из игровой таблицы, но отображает teamName из таблицы team. По сути, я хочу, чтобы вывод «ВЫБЕРИТЕ hometeam, homescore, awayteam, awayscore», но вместо того, чтобы показывать идентификаторы teamID, я хочу видеть teamNames в столбцах homeTeam и awayTeam. Я считаю, что это можно сделать с помощью Joins, но не в состоянии заставить его работать.

create table team (
  teamID        number(2,0) not null,
  teamAbb       varchar2(3),
  teamName      varchar2(20),
  location      varchar2(20),
  division      varchar2(20),
  conference    varchar2(20),
  constraint pk_team primary key (teamID)
);

create table game(
 gameID     number(2,0) not null,
 gameDate   date,
 homeTeam   number(2,0),
 homeScore  number(2,0),
 awayTeam   number(2,0),
 awayScore  number(2,0),
 constraint pk_game primary key (gameID),
 constraint fk_homeTeam foreign key (homeTeam) references team (teamID),
 constraint fk_awayTeam foreign key (awayTeam) references team (teamID)
);

С этими вставленными

DECLARE

BEGIN

insert into team values(10, 'ANA', 'Ducks', 'Anaheim', 'Pacific', 'Western');
insert into team values(11, 'ARI', 'Coyotes', 'Arizona', 'Pacific', 'Western');
insert into team values(12, 'BOS', 'Bruins ', 'Boston', 'Atlantic', 'Eastern');
insert into team values(13, 'BUF', 'Sabers ', 'Buffalo', 'Atlantic', 'Eastern');

COMMIT;

END;

DECLARE

BEGIN

insert into game values (1, to_date('01-11-2020','mm-dd-yyyy'), 10, 2, 11, 1);
insert into game values (2, to_date('01-13-2020','mm-dd-yyyy'), 11, 5, 12, 6);
insert into game values (3, to_date('03-04-2020','mm-dd-yyyy'), 10, null, 13, null);

COMMIT;

END;

Это то, что я вижу в настоящее время с моим SELECT enter image description here

Ответы [ 3 ]

3 голосов
/ 06 февраля 2020

Вам нужно будет выполнить 2 соединения с таблицей команд

Запрос

select t1.teamName AS HomeTeam, g.homeScore, t2.teamName AS AwayTeam, g.awayScore
from    game g
    inner join team t1 ON t1.teamID = g.homeTeam
    inner join team t2 ON t2.teamID = g.awayTeam

Результат

HomeTeam    HomeScore    AwayTeam   AwayScore
---------------------------------------------
Ducks       2            Coyotes    1
Coyotes     5            Bruins     6
Ducks       NULL         Sabers     NULL
0 голосов
/ 06 февраля 2020

Вы можете сделать это следующим образом:

select t.teamName "Home team"
       , homescore "Home score"
       , (select teamname from team where teamID = g.awayTeam) "Away team"
       , awayscore "Away score"
from team t 
join game g
on t.teamid = g.hometeam;

PS: Вы также можете добавить псевдонимы к столбцам (псевдонимы - это имена столбцов, которые будут отображаться в результате)

Здесь вы можете увидеть демо

Когда речь идет о спортивных результатах, вы также можете показать его так:

select t.teamName || '-' ||(select teamname from team where teamID = g.awayTeam) "HOME - AWAY"
       , NVL(homescore, 0) || ':' || NVL(awayscore,0) "SCORE"
from team t 
join game g
on t.teamid = g.hometeam

Где вы объедините названия команд и результаты и с NVL NULL значения будут превращены в 0 в результате.

Вот DEMO для этой опции.

0 голосов
/ 06 февраля 2020

Я думаю, вы просто хотите два соединения:

select th.teamname as hometeam, g.homescore,
       ta.teamname as awayteam, g.awayscore
from games g join
     teams th
     on g.hometeam = th.teamid join
     teams ta
     on g.awayteam = ta.teamid;
...