найти отличные пары в sql - PullRequest
1 голос
/ 21 января 2020

Когда я столкнулся с этой проблемой, я пытался выучить неуравнительные соединения. У меня есть таблица pops:

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| country    | varchar(100) | YES  |     | NULL    |       |
| continent  | varchar(100) | YES  |     | NULL    |       |
| population | bigint(20)   | YES  |     | NULL    |       |

Я пытался найти страны с их населением в районе, скажем, 100.

   select distinct 
       p1.country, 
       p2.country, 
       p1.population, 
       p2.population 
   from pops p1 
       inner join pops p2 
           on p1.population between p2.population - 100 and p2.population + 100 
           and p1.country <> p2.country  
   where p2.country <> p1.country

Вывод, который я получил:

+------------+------------+------------+------------+
| country    | country    | population | population |
+------------+------------+------------+------------+
| pakistan   | india      |      99988 |      99999 |
| china      | india      |      99990 |      99999 |
| bangladesh | japan      |        999 |        999 |
| india      | pakistan   |      99999 |      99988 |
| china      | pakistan   |      99990 |      99988 |
| japan      | bangladesh |        999 |        999 |
| india      | china      |      99999 |      99990 |
| pakistan   | china      |      99988 |      99990 |
+------------+------------+------------+------------+

Как мы видим, я получаю пары (Индия, Пакистан), а также (Пакистан, Индия), что в отношении данных то же самое. Можно ли удалить одну из записей из пары?

Ответы [ 2 ]

7 голосов
/ 21 января 2020

Вы можете решить, что лексографически первая (или последняя, ​​ради аргумента) страна должна быть на стороне p1 - используйте < (или >) вместо <>. Также обратите внимание, что ваше предложение where является избыточным, поскольку у вас уже есть это условие в предложении on join:

select     p1.country, 
           p2.country, 
           p1.population, 
           p2.population 
from       pops p1 
inner join pops p2 
           on p1.population between p2.population - 100 and p2.population + 100 and
               p1.country < p2.country  
-- Here ------------------^
3 голосов
/ 21 января 2020

просто измените условие соединения p1.country <> p2.country на p1.country

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...