Возможно, следующее может дать вам представление: -
Допустим, следующие сокращенные версии (столбцы опущены для краткости) ваших таблиц вместе с некоторыми данными (12 пьес) и 4 совпадениями, 2 одиночными и 2 двойными:-
DROP TABLE IF EXISTS players;
DROP TABLE IF EXISTS matches;
CREATE TABLE IF NOT EXISTS players (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS matches (
id INTEGER PRIMARY KEY,
match_date TEXT,
match_time TEXT,
match_type INTEGER DEFAULT 1, -- 1 = singles(default) 2 = doubles
side1_player1 INTEGER NOT NULL,
side1_player2 INTEGER,
side2_player1 INTEGER NOT NULL,
side2_player2 INTEGER
);
INSERT INTO players (name)
VALUES
('Fred'), -- player 1
('Bert'), -- player 2
('Mary'), -- 3
('Ann'), -- 4
('Mark'), -- 5
('Jane'), -- 6
('Alan'), -- 7
('Susan'), -- 8
('Charles'), -- 9
('Cathryn'), -- 10
('George'), -- 11
('Elaine'); -- 12
-- Singles matches
INSERT INTO matches (match_date, match_time, match_type, side1_player1, side2_player1)
VALUES
('2018-01-01','10:30',1,1,11), -- Fred v George
('2018-01-01','11:30',1,3,10) -- Mary v Cathryn
;
-- Doubles matches
INSERT INTO matches (match_date, match_time, match_type,side1_player1,side1_player2,side2_player1,side2_player2)
VALUES
('2018-01-01','14:00',2,1,2,7,9), -- Fred & Bert v Alan & Charles
('2018-01-01','15:00',2,4,12,6,3) -- Ann & Elaine v Jane & Mary
Таким образом, таблица Игроков выглядит так: -

А таблица Матчей выглядит так: -

Тогда: -
SELECT
CASE
WHEN match_type = 2 THEN 'Doubles'
WHEN match_type = 1 THEN 'Singles'
END AS type_of_match,
match_date, match_time,
CASE
WHEN match_type = 2 THEN
side1player1.name || ' and ' || side1player2.name ||
' V ' ||
side2player1.name || ' and ' || side2player2.name
WHEN match_type = 1 THEN
side1player1.name ||
' V ' ||
side2player1.name
END AS players
FROM matches
JOIN players AS side1player1 ON side1_player1 = side1player1.id
JOIN players AS side2player1 ON side2_player1 = side2player1.id
LEFT JOIN players AS side1player2 ON side1_player2 = side1player2.id
LEFT JOIN players AS side2player2 ON side2_player2 = side2player2.id
;
В результате: -

Без манипулирования производными столбцами запрос будет: -
SELECT *
FROM matches
JOIN players AS side1player1 ON side1_player1 = side1player1.id
JOIN players AS side2player1 ON side2_player1 = side2player1.id
LEFT JOIN players AS side1player2 ON side1_player2 = side1player2.id
LEFT JOIN players AS side2player2 ON side2_player2 = side2player2.id
;
И это приведет к: -
