Как удалить обратные дубликаты из моего запроса? - PullRequest
0 голосов
/ 19 октября 2019

Я решаю упражнения по SQL от Lagunita Stanford, и остановился на вопросе № 3 (Упражнения по SQL-запросам в социальных сетях). Я не знаю, как удалить обратные дубликаты из моего запроса:

    Gabriel    9  |  Cassandra  9
    ------------------------------
    Cassandra  9  |  Gabriel    9
    ------------------------------
    Jessica    11 |  Kyle       12
    ------------------------------
    Kyle       12 |  Jessica    11

Ответ должен быть таким:

        Cassandra  9  |  Gabriel    9
        ------------------------------
        Jessica    11 |  Kyle       12

Это мой код:

SELECT h1.name,
   h1.grade,
   h2.name,
   h2.grade          
FROM likes AS likes1
INNER JOIN likes AS likes2
   ON likes1.id1 = likes2.id
   AND likes1.id2 = likes2.id1
INNER JOIN highschooler  AS h1 ON likes1.id1 = h1.id
INNER JOIN highschooler  AS h2 ON likes2.id1 = h2.id

Таблицы: https://lagunita.stanford.edu/c4x/DB/SQL/asset/socialdata.html

И я не могу использовать оконные функции и cte's.

И мне любопытно, если это возможно, чтобы удалить дубликаты в том же запросе.

1 Ответ

1 голос
/ 19 октября 2019

Ваш текущий набор результатов в том виде, в котором он сформирован, содержит каждую пару дважды, и все, что вам нужно сделать, чтобы удалить одну из 2 строк, - это применить условие WHERE:

SELECT h1.name name1,
       h1.grade grade1,
       h2.name name2,
       h2.grade grade2
FROM likes AS likes1
INNER JOIN likes AS likes2 ON likes1.id1 = likes2.id2 AND likes1.id2 = likes2.id1
INNER JOIN highschooler  AS h1 ON likes1.id1 = h1.id
INNER JOIN highschooler  AS h2 ON likes2.id1 = h2.id
WHERE h1.name < h2.name 

или это может быть:

WHERE likes1.id1 < likes1.id2  

, если есть случай, когда 2 старшеклассника имеют одно и то же имя. Смотрите демо . Результаты:

| name1     | grade1 | name2   | grade2 |
| --------- | ------ | ------- | ------ |
| Cassandra | 9      | Gabriel | 9      |
| Jessica   | 11     | Kyle    | 12     |
...