为什么!=对于psql中的此自我联接查询不正确

时间:2018-12-04 19:36:03

标签: mysql psql

以下是用于创建表的代码

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 :(得分:0)

这很正常。您所获得的结果与预期的一样,除了前两个结果完全不同。如果您注意前两列,则在比较前两列结果时会看到它们已被交换。

但是条件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,则将得到上述的 all ,即除(1,1),(2, 2),(3、3):

(1、2),(1、3),(2、3),(2、1),(3、1)和(3、2)

然后在查询中对它们进行排序,但这并没有改变本质:与其他条件之一相比,a.id != b.id得到的结果要多两倍。