2015-04-21 3 views
2

Я хочу получить один результирующий набор строк из двух таблиц с разными именами столбцов, по одной строке на строку в каждой таблице.SQL-объединение двух таблиц с разными столбцами

Результат должен выглядеть следующим образом, заготовка может быть нулевой, team_id во 2-е половины происходит от coach_id:

----------------------------------------- 
player_id | team_id | score | improvement 
----------------------------------------- 
11   20   5 
11   21   4 
12   22   2 
12   23   2 
11   20     5 
11   21     6 
12   21     5 
13   23     10 

Вот схема:

CREATE TABLE coaches 
    (`id` int, `team_id` int) 
; 

INSERT INTO coaches 
    (`id`, `team_id`) 
VALUES 
    (1, 20), 
    (2, 21), 
    (3, 22), 
    (4, 23) 
; 

CREATE TABLE players 
(`id` int, `player_id` int); 


INSERT INTO players 
(`id`, `player_id`) 
VALUES 
(1,11), 
(2,12), 
(3,13), 
(4,14) 
; 
CREATE TABLE games 
    (`id` int, `player_id` int, `team_id` int, `score` int) 
; 

INSERT INTO games 
    (`id`, `player_id`, `team_id`, `score`) 
VALUES 
    (1, 11, 20, 5), 
    (2, 11, 21, 4), 
    (3, 12, 22, 2), 
    (4, 12, 23, 2) 
; 

CREATE TABLE sessions 
    (`id` int, `player_id` int, `coach_id` int, `improvement` int) 
; 

INSERT INTO sessions 
     (`id`, `player_id`, `coach_id`, `improvement`) 
VALUES 
    (1, 11, 1, 5), 
    (2, 11, 2, 6), 
    (3, 12, 2, 5), 
    (4, 13, 4, 10) 
; 

Пробовал, но это не было на самом деле близко:

SELECT tweets.player_id 
     ,tweets.team_id 
     ,follows.coach_id 
FROM tweets FULL OUTER JOIN follows ON (1 = 0); 
+0

Что вы пробовали до сих пор? –

+0

Ничто из того, что я пробовал, действительно было близко. ВЫБОР tweets.player_id, tweets.team_id, follows.coach_id ИЗ твиты полного внешнего соединения следующим образом ON (1 = 0); – mtbomb

+1

Квотные идентификаторы, использующие обратную ссылку, недействительны для Postgres, вы уверены, что используете Postgres? Это больше похоже на MySQL. –

ответ

1

nulnullry это

SELECT player_id 
    ,team_id 
    ,score 
    ,NULL AS improvement 
FROM games 
UNION All 
SELECT sessions.player_id 
    ,coaches.team_id 
    ,NULL AS score 
    ,sessions.improvement 
FROM sessions 
INNER JOIN coaches ON coaches.id = sessions.coach_id 
+0

, затем попробуйте null как счет –

+0

Вы протестировали его в своей среде? Я так не думаю, потому что 'UNION' не поможет вам получить точный результат, поэтому вам нужно использовать' UNION ALL' –

+0

да, я так думаю .... u r right –

1

Что-то вроде:

select player_id 
    , team_id 
    , score 
    , cast(null as int) as improvement 
from games 
union all 
select s.player_id 
    , c.team_id 
    , cast(null as int) as score 
    , s.improvement 
from sessions as s 
join coaches as c 
    on s.coach_id = c.id 
order by score 

должен работать

Смежные вопросы