2

我有一个包含以下列的表;a、b、e 和另一个包含 c、d 的表 table2。两个表都有一个列name

我做了一个查询:

SELECT distinct a, b
from db.table
where e <>'65';

我说,1885 条记录

然后,我需要另一个表 (c, d) 中的更多信息。我使用内部连接来获取这些附加信息。查询变为:

SELECT distinct a, b, c, d 
from db.table
inner join db.table2
on table.name=table2.name2
where e <>'65';

现在,我期待相同的结果,但有额外的列 (c, d)。但是我得到了不同数量的结果:51144。任何人都可以解释一下为什么数量增加了,而我只是添加了更多的列并且没有改变条件?

4

5 回答 5

1

它被称为笛卡尔积,实际上这意味着您可能需要更精确地确定连接ON条件。

只有当表包含一个且只有一个与表中每一行的table2条件匹配的记录时,才会有相同的结果table.name=table2.name2table

于 2012-08-15T04:55:02.050 回答
1

INNER JOINON将仅返回与两个表中给定列(在条件中使用)的相同值匹配的结果。

于 2012-08-15T04:57:35.460 回答
0

有什么令人惊讶的?您在 select 语句和另一个表中添加了另外 2 列。

例如 distinct 将应用于不重复的 4 列 (a,b,c,d)

如果你的桌子是这样的

A B C D E
1 2 1 1
1 2 3 4
1 2 4 5
1 2 4 5

您的第一个语句将选择不同的 A,B,它只有 1,2。第二条语句将选择 1,2,1,1 - 1,2,3,4 - 1,2,4,5 只要满足条件 e <> 65

对于其余部分,您需要使用ON来更具体地选择您的选择。

于 2012-08-15T04:57:36.210 回答
0

正如关键字所说,DISTINCT 返回来自选择的不同结果。

您向不同选择添加附加列的事实可能会导致不同结果集成为更多行。让我们看一个例子

区别于

A   B
1   2
1   3
1   2

将会

A   B
1   2
1   3

但现在添加额外的列,让说

A   B   C
1   2   1
1   3   2
1   2   3

将导致

A   B   C
1   2   1
1   3   2
1   2   3

此外,您的内连接可以限制结果集,因为内连接只会返回 table1 和 table2 中的值,因此 table1 中存在给定值,但 table2 中没有它不会返回。

或者正如@zerkms 所提到的,如果有 2 个键定义了 2 个表之间的关系,那么您可能会得到比预期更多的结果。

于 2012-08-15T04:58:47.523 回答
0

这是因为DISTINCT关键字适用于整行

假设您有以下结果:

a       b        c         d
=====================================
1       1        1         1
1       1        3         2
1       1        4         2
1       2        5         2
1       2        6         6
1       3        1         1

如果你申请DISTINCT a, b,它应该导致:

a       b     
==============
1       1             
1       2      
1       3    

因为其中两条记录与1, 1. 如果您说,它将返回所有记录DISTINCT a, b, c ,d

您的查询返回多条记录的另一个原因是,可能是 的记录在 的记录上tableA有许多对应的匹配项tableB。假设tableA您只有 1 条记录,但在tableB该记录中有 5 条记录的对应匹配项。如果您尝试加入表,而不是表 A 中的 1 条记录,它现在应该5 rows因为匹配而返回。

于 2012-08-15T04:59:01.087 回答