Почему! = Не правильно для этого самостоятельного присоединения запроса в PSQL - PullRequest
0 голосов
/ 04 декабря 2018

Ниже приведен код для создания таблицы

create table residences(
id integer
references students,
building text
references buildings(name),
room text
);

Ниже приведен код для запроса.

select a.id, b.id, a.building, a.room
    from residences as a, residences as b
where a.building = b.building
and a.room = b.room
and a.id > b.id
order by a.building, a.room;


|     id |     id | building | room |
+--------+--------+----------+------+
| 881256 | 413001 |   Crosby |   10 |
| 741532 | 496747 |   Crosby |   19 |
| 931027 | 612413 |   Crosby |   31 |
| 958827 | 170267 | Dolliver |    1 |
| 707536 | 104131 | Dolliver |   14 |
| 505241 | 477801 | Dolliver |    8 |
| 824292 | 118199 | Kendrick |   1A |
| 231742 | 105540 | Kendrick |   3B |
+--------+--------+----------+------+

Я пробовал оба

and a.id > b.id

и

and a.id < b.id

оба дали одинаковый результат выше.

Однако, когда я использовал

and a.id != b.id

Он не работал, вместо этого он выдал

+--------+--------+----------+------+
|     id |     id | building | room |
+========+========+==========+======+
| 413001 | 881256 |   Crosby |   10 |
| 881256 | 413001 |   Crosby |   10 |
| 496747 | 741532 |   Crosby |   19 |
| 741532 | 496747 |   Crosby |   19 |
| 612413 | 931027 |   Crosby |   31 |
| 931027 | 612413 |   Crosby |   31 |
| 170267 | 958827 | Dolliver |    1 |
| 958827 | 170267 | Dolliver |    1 |
| 104131 | 707536 | Dolliver |   14 |
| 707536 | 104131 | Dolliver |   14 |
| 477801 | 505241 | Dolliver |    8 |
| 505241 | 477801 | Dolliver |    8 |
| 118199 | 824292 | Kendrick |   1A |
| 824292 | 118199 | Kendrick |   1A |
| 105540 | 231742 | Kendrick |   3B |
| 231742 | 105540 | Kendrick |   3B |
+--------+--------+----------+------+

Может кто-нибудь сказать мне, почему?

1 Ответ

0 голосов
/ 06 декабря 2018

Это вполне нормально.Полученные результаты соответствуют ожидаемым, за исключением того, что первые два результата не являются точно одинаковыми.Если вы обратите внимание на первые два столбца, вы увидите, что они поменялись местами при сравнении первых двух результатов.

Но условие a.id != b.id менее ограничительно, чем два других, и, следовательно, даст больше результатов.

Например:

Если у вас есть значения 1, 2 и 3 и требуется a.id < b.id, вы получите в качестве возможных комбинаций:

(1, 2), (1, 3) и (2, 3).

Если вам требуется a.id > b.id, вы получаете следующие комбинации:

(2, 1), (3, 1) и (3, 2).

Обратите внимание, что эти пары похожи, как указано выше, но не одинаковы: порядок значений в каждой паре противоположен - соответствует условию.

И, наконец, если вы (только)требуют (менее ограничительный) a.id != b.id, тогда вы получите все из вышеперечисленного, то есть все возможные пары, кроме (1, 1), (2, 2), (3, 3):

(1, 2), (1, 3), (2, 3), (2, 1), (3, 1) и (3, 2)

В вашем запросе они затем упорядочиваются, но это не меняет сути: вы получаете вдвое больше результатов с a.id != b.id, чем с одним из других условий.

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