2012-08-15 120 views
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.请问任何人都可以解释为什么数字增加了,而我只是增加了更多列而没有改变条件?

回答

0

DISTINCT返回关键词说,从选择不同的结果。

事实上,您将不同的select添加额外的列可能会导致不同的结果集更多的行。让我们看看一个例子

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 

更进一步,你内心的加入可以限制结果集,因为内部联接仅返回在两个表1和表2的值,因此给定值存在于表1,但不是在表2也不会被退回。

或者像被@zerkms提到,如果有2个键定义2和表之间的关系,你可能会得到更多,你的预期。

+0

'DISTINCT'是一个邪恶的操作符:-)而不是假装没有问题 - 它总是更好只写**正确的**查询不返回笛卡尔积 – zerkms 2012-08-15 05:01:22

+0

@zerkms,完全一致,但你是否知道1多个连接,这不是笛卡尔积/交叉连接? – 2012-08-15 05:04:06

+0

当我执行1:N实体查询我不希望结果集中的行数是因为它是在原来的1 - 实体查询:-) – zerkms 2012-08-15 05:08:16

1

它被称为cartesian product,实际上这意味着您可能需要更加精确地加入ON条件。

如果table2表包含一个且只有一个符合条件table.name=table2.name2每每一行从table

1

INNER JOIN将只返回匹配给定相同的值这些结果记录了同样的结果将是唯一可能列(在ON条件中使用)。

0

什么是令人惊讶的?您还有2列添加到您的选择语句和另一个表。

截然不同如果你的表是这样的

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

你是第一个语句将适用于4列(A,B,C,d),不进行重复

为例将选择不同的A,B,它只有1,2。第二条语句将选择1,2,1,1 - 1,2,3,4 - 1,2,4,5,只要它符合条件e <> 65

对于其他需要使用ON对您的选择更具体。

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条相应的匹配。如果尝试加入表格,而不是tableA中的1条记录,则现在应返回5 rows,因为匹配。

+0

如何编辑查询以传达不同(a)的含义? b,c,d只需要在结果中显示为a的详细信息。唯一值得注意的是a。 – 2012-08-24 07:10:13

+0

您可以将其包装在子查询中:D – 2012-08-24 07:11:10

+0

请示例。 – 2012-08-24 07:16:15

相关问题