Dobrym miejscem do rozpoczęcia byłoby:
SELECT
A.num_1, B.num_2
FROM
Smaller AS A JOIN Smaller AS B ON (A.num_1 < B.num_2)
ORDER BY A.num_1, B.num_2;
Wewnątrz procedury składowanej umieść to w kursorze, iteruj nad kursorem i dla każdego wiersza wykonaj INSERT IGNORE. Tzn.:
DECLARE num1,num2 INT;
DECLARE done DEFAULT 0;
DECLARE mycursor CURSOR FOR SELECT # use the select above, im lazy here
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN mycursor;
my_loop: LOOP
FETCH mycursor INTO num1, num2;
IF done THEN
LEAVE my_loop;
END IF;
INSERT IGNORE INTO Smaller VALUES (num1,num2);
END LOOP;
Aby odpowiedzieć na twoje zaktualizowane pytanie, nie jesteś do końca pewien, czy masz na myśli połączone jako za pomocą relacji między unikalnymi wierszami (do przechowywania tej relacji potrzebne byłyby dwie kolumny, więc byłoby to dość podobne). Lub jeśli masz na myśli jedną tabelę zawierającą wszystkie liczby, a drugą tabelę z dwiema kolumnami zawierającą relacje między wierszami pierwszej tabeli.
Lub na koniec, jeśli chcesz, aby tabela zawierała tylko ciągi z „1-2”, „1-3” itp. W takim przypadku zachowałbym ją jako dwie oddzielne kolumny i po prostu wypisz je jako ciągi za pomocą CONCAT podczas sondowania stół :)