SQL INNER JOIN 意外结果
SQL INNER JOIN Unexpected Result
我已经尝试理解这个问题将近 2 个多小时了,但我仍然无法理解我的 JOIN
查询的输出。
我有一个 table 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
在同一个 table 上,并且从字面上比较相同的列值。因此,理论上结果应该是 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
以比较其他列,则输出为 12 rows
,这是预期的。
谁能解释为什么这不包括列值 18 和 30?因为它们实际上是一样的。它正在选择所有其他重复值,但不选择这两个值。
不应该自联接与同一列的比较始终 return all
table 中存在的值两次?
此致
实际上它按预期返回了 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;
giftid | giftname | discount | availability
:----- | :---------------- | -------: | -----------:
G105 | French F | 7 | 10
G101 | Magic Mug | 9 | 10
G104 | Renoir Paintings | 15 | 15
G102 | Golf Set | 5 | 15
G103 | Little Astronomer | 20 | 18
G104 | Renoir Paintings | 15 | 15
G102 | Golf Set | 5 | 15
G105 | French F | 7 | 10
G101 | Magic Mug | 9 | 10
G106 | Magic Set | 30 | 30
SELECT g1.giftid, g1.giftname, g1.discount, g1.availability , g2.*
FROM gift g1 JOIN gift g2
ON g1.availability=g2.availability;
giftid | giftname | discount | availability | giftid | giftname | price | discount | availability
:----- | :---------------- | -------: | -----------: | :----- | :---------------- | ----: | -------: | -----------:
G105 | French F | 7 | 10 | G101 | Magic Mug | 500 | 9 | 10
G101 | Magic Mug | 9 | 10 | G101 | Magic Mug | 500 | 9 | 10
G104 | Renoir Paintings | 15 | 15 | G102 | Golf Set | 3550 | 5 | 15
G102 | Golf Set | 5 | 15 | G102 | Golf Set | 3550 | 5 | 15
G103 | Little Astronomer | 20 | 18 | G103 | Little Astronomer | 2000 | 20 | 18
G104 | Renoir Paintings | 15 | 15 | G104 | Renoir Paintings | 1500 | 15 | 15
G102 | Golf Set | 5 | 15 | G104 | Renoir Paintings | 1500 | 15 | 15
G105 | French F | 7 | 10 | G105 | French F | 3000 | 7 | 10
G101 | Magic Mug | 9 | 10 | G105 | French F | 3000 | 7 | 10
G106 | Magic Set | 30 | 30 | G106 | Magic Set | 1300 | 30 | 30
db<>fiddle here
Shouldn't a self join with comparison of the same column always return all of the values present in the table twice?
否,如果连接列中的值是唯一的,则该行将连接到自身并返回一行。根据之前的回答,只有当连接列中存在重复值时,您才会获得更多行
我已经尝试理解这个问题将近 2 个多小时了,但我仍然无法理解我的 JOIN
查询的输出。
我有一个 table 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
在同一个 table 上,并且从字面上比较相同的列值。因此,理论上结果应该是 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
以比较其他列,则输出为 12 rows
,这是预期的。
谁能解释为什么这不包括列值 18 和 30?因为它们实际上是一样的。它正在选择所有其他重复值,但不选择这两个值。
不应该自联接与同一列的比较始终 return all
table 中存在的值两次?
此致
实际上它按预期返回了 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;
giftid | giftname | discount | availability :----- | :---------------- | -------: | -----------: G105 | French F | 7 | 10 G101 | Magic Mug | 9 | 10 G104 | Renoir Paintings | 15 | 15 G102 | Golf Set | 5 | 15 G103 | Little Astronomer | 20 | 18 G104 | Renoir Paintings | 15 | 15 G102 | Golf Set | 5 | 15 G105 | French F | 7 | 10 G101 | Magic Mug | 9 | 10 G106 | Magic Set | 30 | 30
SELECT g1.giftid, g1.giftname, g1.discount, g1.availability , g2.* FROM gift g1 JOIN gift g2 ON g1.availability=g2.availability;
giftid | giftname | discount | availability | giftid | giftname | price | discount | availability :----- | :---------------- | -------: | -----------: | :----- | :---------------- | ----: | -------: | -----------: G105 | French F | 7 | 10 | G101 | Magic Mug | 500 | 9 | 10 G101 | Magic Mug | 9 | 10 | G101 | Magic Mug | 500 | 9 | 10 G104 | Renoir Paintings | 15 | 15 | G102 | Golf Set | 3550 | 5 | 15 G102 | Golf Set | 5 | 15 | G102 | Golf Set | 3550 | 5 | 15 G103 | Little Astronomer | 20 | 18 | G103 | Little Astronomer | 2000 | 20 | 18 G104 | Renoir Paintings | 15 | 15 | G104 | Renoir Paintings | 1500 | 15 | 15 G102 | Golf Set | 5 | 15 | G104 | Renoir Paintings | 1500 | 15 | 15 G105 | French F | 7 | 10 | G105 | French F | 3000 | 7 | 10 G101 | Magic Mug | 9 | 10 | G105 | French F | 3000 | 7 | 10 G106 | Magic Set | 30 | 30 | G106 | Magic Set | 1300 | 30 | 30
db<>fiddle here
Shouldn't a self join with comparison of the same column always return all of the values present in the table twice?
否,如果连接列中的值是唯一的,则该行将连接到自身并返回一行。根据之前的回答,只有当连接列中存在重复值时,您才会获得更多行