Opret et unikt indeks:
CREATE UNIQUE INDEX matches_uni_idx ON matches
(greatest(winner, loser), least(winner, loser));
Kan ikke være en UNIQUE
eller PRIMARY KEY
begrænsning, da de kun virker med kolonner, ikke udtryk.
Du kan tilføje en serial
kolonne til at tjene som PK, men med kun to heltalskolonner er din originale PK også meget effektiv (se kommentarer). Og det gør begge kolonner NOT NULL
automatisk. (Ellers skal du tilføje NOT NULL
begrænsninger.)
Du kan også tilføje en CHECK
begrænsning for at udelukke spillere, der spiller mod sig selv:
CHECK (winner <> loser)
Tip:For at søge efter et par id'er (hvor du ikke ved, hvem der vandt), indbygg de samme udtryk i din forespørgsel, og indekset vil blive brugt:
SELECT * FROM matches
WHERE greatest(winner, loser) = 3 -- the greater value, obviously
AND least(winner, loser) = 1;
Hvis du beskæftiger dig med ukendte parametre, og du ikke ved, hvilken der er størst på forhånd:
WITH input AS (SELECT $id1 AS _id1, $id2 AS _id2) -- input once
SELECT * FROM matches, input
WHERE greatest(winner, loser) = greatest(_id1, _id2)
AND least(winner, loser) = least(_id1, _id2);
CTE-indpakningen er kun for nemheds skyld at indtaste parametre én gang og ikke nødvendig i nogle sammenhænge.