以下是用于创建表的代码
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 |
+--------+--------+----------+------+
谁能告诉我为什么?
答案 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
得到的结果要多两倍。