连接条件下的SQL查询

连接条件下的SQL查询,sql,Sql,我尝试了这个查询来连接我的5个表,我得到了结果,但它重复了4次。请帮助我解决此问题。\p>如何解决此问题: 要解决代码的实际问题,必须重做正在使用的数据库模式。目前,只有一个表连接所有其他表。这会导致笛卡尔积发生,因为除了一个主表之外,表之间没有其他关系。因为只有一个表将所有这些表链接在一起,所以SQL不知道如何将数据组合到单个表中,因此创建了笛卡尔积表,其中包含来自这些表的数据组合 #快速修复: 每当您想要获得唯一的数据时,都需要使用distinct关键字。这将从结果表中删除数据完全相同的行:

我尝试了这个查询来连接我的5个表,我得到了结果,但它重复了4次。请帮助我解决此问题。

\p>如何解决此问题: 要解决代码的实际问题,必须重做正在使用的数据库模式。目前,只有一个表连接所有其他表。这会导致笛卡尔积发生,因为除了一个主表之外,表之间没有其他关系。因为只有一个表将所有这些表链接在一起,所以SQL不知道如何将数据组合到单个表中,因此创建了笛卡尔积表,其中包含来自这些表的数据组合

#快速修复: 每当您想要获得唯一的数据时,都需要使用
distinct
关键字。这将从结果表中删除数据完全相同的行:

SELECT * 
FROM header 
   INNER JOIN co ON header.Subject = co.Subject 
   INNER JOIN signature ON header.Subject = signature.Subject 
   INNER JOIN q2 ON header.Subject = q2.Subject 
   INNER JOIN q1 ON header.Subject = q1.Subject 
WHERE header.Branch = 'BIOM' AND header.Semester='VIII' 
   AND header.Subject='II' AND co.Subject='II' 
   AND signature.Subject='II' AND q1.Subject='II' AND q2.Subject='II';
同样,在
where
子句中,您不需要所有那些
语句,因为您已经加入了表

这将产生相同的结果:

SELECT DISTINCT * 
FROM header 
   INNER JOIN co ON header.Subject = co.Subject 
   INNER JOIN signature ON header.Subject = signature.Subject 
   INNER JOIN q2 ON header.Subject = q2.Subject 
   INNER JOIN q1 ON header.Subject = q1.Subject 
WHERE header.Branch = 'BIOM' AND header.Semester='VIII' 
   AND header.Subject='II' AND co.Subject='II' 
   AND signature.Subject='II' AND q1.Subject='II' AND q2.Subject='II';

您应该提供一些关于表的信息。关于它们的列。例如,在sam主题为“一个表”的表中是否有多条记录?请教育人们,为什么他们的查询有一个笛卡尔乘积乘以行数,而不仅仅是说“mehh..在那里敲击DISTINCT..没问题!”。你知道的下一个问题是“我的查询返回了一百万条重复记录,所以我只是像互联网上的那个人告诉我的那样在那里输入了DISTINCE,但现在它使我的生产系统崩溃。ps;在一个实时股票交易应用程序中,查询每秒被调用100次”@CaiusJard我完全同意。你的评论让我大吃一惊!我更正了我的答案。我希望我的解释是正确的。我个人会更详细地解释笛卡尔积为什么会出现,btw@CaiusJard我更新了我的答案。我希望现在更好。Tysm@bhristov。我已经使用了这个方法,但它仍然在输出中显示出同样的问题
SELECT DISTINCT * 
FROM header 
   INNER JOIN co ON header.Subject = co.Subject 
   INNER JOIN signature ON header.Subject = signature.Subject 
   INNER JOIN q2 ON header.Subject = q2.Subject 
   INNER JOIN q1 ON header.Subject = q1.Subject 
WHERE header.Branch = 'BIOM' AND header.Semester='VIII' 
   AND header.Subject='II';