繁体   English   中英

SQL INNER JOIN 意外结果

[英]SQL INNER JOIN Unexpected Result

我已经尝试理解这一点将近 2 小时了,但我仍然无法理解我的JOIN查询的 output。

我有一个结构的餐桌gift

+--------+-------------------+-------+----------+--------------+
| giftid | giftname          | price | discount | availability |
+--------+-------------------+-------+----------+--------------+
| G101   | Magic Mug         |   500 |        9 |           10 |
| G102   | Golf Set          |  3550 |        5 |           15 |
| G103   | Little Astronomer |  2000 |       20 |           18 |
| G104   | Renoir Paintings  |  1500 |       15 |           15 |
| G105   | French F          |  3000 |        7 |           10 |
| G106   | Magic Set         |  1300 |       30 |           30 |
+--------+-------------------+-------+----------+--------------+

我在同一张表上运行JOIN并从字面上比较相同的列值。 所以,理论上结果应该是12行。 这适用于除availability之外的每一列。

这是我的 SQL 查询:

SELECT g1.giftid, g1.giftname, g1.discount, g1.availability FROM gift g1 JOIN gift g2 ON g1.availability=g2.availability;

如果我更改g1.availability=g2.availability以比较其他列,则 output 为12 rows ,这是预期的。

谁能解释为什么这不包括列值 18 和 30? 因为它们实际上是一样的。 它正在选择所有其他重复值,但不是这两个。

与同一列进行比较的自连接不应该总是两次返回表中存在的all值吗?

问候

实际上它按预期返回了 10 行

只有 10 和 15 是双倍的,所以你得到 8,因为 18 和 30 是唯一的,所以你得到 2 多行

CREATE TABLE gift ( `giftid` VARCHAR(4), `giftname` VARCHAR(17), `price` INTEGER, `discount` INTEGER, `availability` INTEGER ); INSERT INTO gift (`giftid`, `giftname`, `price`, `discount`, `availability`) VALUES ('G101', 'Magic Mug', '500', '9', '10'), ('G102', 'Golf Set', '3550', '5', '15'), ('G103', 'Little Astronomer', '2000', '20', '18'), ('G104', 'Renoir Paintings', '1500', '15', '15'), ('G105', 'French F', '3000', '7', '10'), ('G106', 'Magic Set', '1300', '30', '30');
 SELECT g1.giftid, g1.giftname, g1.discount, g1.availability FROM gift g1 JOIN gift g2 ON g1.availability=g2.availability;
 礼物| 礼品名称 | 折扣 | 可用性:----- |:---------------- |  --------: |  ------------: G105 | 法语 F |  7 |  10 G101 | 魔术杯 |  9 |  10 G104 | 雷诺阿绘画 |  15 |  15 G102 | 高尔夫套装 |  5 |  15 G103 | 小天文学家 |  20 |  18 G104 | 雷诺阿绘画 |  15 |  15 G102 | 高尔夫套装 |  5 |  15 G105 | 法语 F |  7 |  10 G101 | 魔术杯 |  9 |  10 G106 | 魔法套装 |  30 |  30
 SELECT g1.giftid, g1.giftname, g1.discount, g1.availability, g2.* FROM gift g1 JOIN gift g2 ON g1.availability=g2.availability;
 礼物| 礼品名称 | 折扣 | 可用性 | 礼物| 礼品名称 | 价格 | 折扣 | 可用性:----- |:---------------- |  --------: |  ------------: |:----- |:---------------- |  ----: |  --------: |  ------------: G105 | 法语 F |  7 |  10 |  G101 | 魔术杯 |  500 |  9 |  10 G101 | 魔术杯 |  9 |  10 |  G101 | 魔术杯 |  500 |  9 |  10 G104 | 雷诺阿绘画 |  15 |  15 |  G102 | 高尔夫套装 |  3550 |  5 |  15 G102 | 高尔夫套装 |  5 |  15 |  G102 | 高尔夫套装 |  3550 |  5 |  15 G103 | 小天文学家 |  20 |  18 |  G103 | 小天文学家 |  2000 |  20 |  18 G104 | 雷诺阿绘画 |  15 |  15 |  G104 | 雷诺阿绘画 |  1500 |  15 |  15 G102 | 高尔夫套装 |  5 |  15 |  G104 | 雷诺阿绘画 |  1500 |  15 |  15 G105 | 法语 F |  7 |  10 |  G105 | 法语 F |  3000 |  7 |  10 G101 | 魔术杯 |  9 |  10 |  G105 | 法语 F |  3000 |  7 |  10 G106 | 魔法套装 |  30 |  30 |  G106 | 魔法套装 |  1300 |  30 |  30

db<> 在这里摆弄

与同一列进行比较的自连接不应该总是两次返回表中存在的所有值吗?

不,如果连接列中的值是唯一的,则该行将与其自身连接并返回一行。 根据上一个答案,当连接列中存在重复值时,您只会获得更多行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM