我有一个包含以下列的表; a,b,e和另一个表table2,包含c,d。两个表都有一列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 :(得分:1)
它被称为cartesian product,实际上它意味着你可能需要更加精确地加入ON
条件。
只有当table2
表包含一条且只有一条记录符合来自table.name=table2.name2
表
table
时,才能获得相同的结果
答案 1 :(得分:1)
INNER JOIN 将仅返回与两个表中给定列的相同值(在ON
条件中使用)匹配的结果。
答案 2 :(得分: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&gt;即可。 65
对于其他人,您需要使用 ON 来更具体地选择。
答案 3 :(得分:0)
DISTINCT返回正如关键词所示,来自select的不同结果。
您要向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个表之间的关系,那么你可能会得到更多的预期。
答案 4 :(得分: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
。