在MS Access中,我从表的查询中得到意外的结果

时间:2015-04-18 23:13:06

标签: sql ms-access

我有以下表格,其中包含以下字段:

  • BeliefT (BeliefID, Beliefs, Topic, Topic2, Topic3, Topic4)
  • ArgumentAgreeT (ReasonToAgreeID, ConclusionA, Reason to agree)这些字段的值来自对BeliefT.BeliefIDBeliefT.Beliefs的查找。
  • ArgumentDisagreeT (ReasonToDisagreeID, ConclusionD, Reason to Disagree)这些字段的值也来自对BeliefT.BeliefIDBeliefT.Beliefs的查找。

我已经尝试了所有我能想到的东西。 这个SQL语句也不错,但它给我带来了奇怪的结果:

SELECT BeliefT.BeliefID, 
       BeliefT.Beliefs, 
       ArgumentsAgreeT.[Reason to agree], 
       ArgumentsDisagreeT.[Reason to Disagree] 
FROM (BeliefT 
      LEFT JOIN ArgumentsAgreeT ON BeliefT.BeliefID = ArgumentsAgreeT.[ConclusionA]) 
LEFT JOIN ArgumentsDisagreeT ON BeliefT.BeliefID = ArgumentsDisagreeT.[ConclusionD];

上面的SQL语句包括第一个表中的前两个内容,以及第二个和第三个表中的Reason to agreeReason to Disagree。从SQL语句可以看出,连接类型是一个从BeliefT.BeliefID指向ArgumentsAgreeT.ConclusionAArgumentsDisagreeT.ConclusionD的箭头

问题在于如果有多个理由同意,并且只有一个理由不同意,那么它会重复出于不同意的理由而不同意。在其他我的agree表(ArgumentAgreeT)中有5条记录。我的不同意表只有2条记录。每当有Agree表中的记录时,它就会从我不同意的表中复制单个记录。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

首先,这里没有self-joins,它们是同一个表的多个引用,在同一个查询中有不同的别名。

其次,SQL查询在技术上Cartesian products根据相应的键从多个集合(连接表)返回组合集(查询)。所以是的,重复记录,因为它们与另一个表配对将显示为特定的组合集。如果在同一个BeliefID上有5个X 2,那么每个BeliefID自然会产生至少10个记录。

另外,您对结果的期望是什么?查询的返回次数不会少于存在的数据。请注意,整个行不是重复的(尽管记录在列中重复),因为每个返回的组合都是不同的。因此即使使用DISTINCT也行不通。

可能,您希望运行一个Union查询,堆叠同意和不同意项目并排不会为每个BeliefID返回少于10条带有表连接的记录。

SELECT BeliefT.BeliefID, BeliefT.Beliefs, ArgumentsAgreeT.[Reason to agree] As [Reason], 'Agree' As [Type]
FROM BeliefT LEFT JOIN ArgumentsAgreeT ON BeliefT.BeliefID = ArgumentsAgreeT.[ConclusionA]
UNION
SELECT BeliefT.BeliefID, BeliefT.Beliefs,  ArgumentsDisagreeT.[Reason to Disagree] As [Reason], 'Disagree' As Type
FROM BeliefT  LEFT JOIN ArgumentsDisagreeT ON BeliefT.BeliefID = ArgumentsDisagreeT.[ConclusionD];

最后,请注意您的问题可能不是查询问题,而是表设计问题。通常,当需要复杂查询时,数据可能未规范化或报告请求不遵循数据存储结构。 normalization的概念是将数据元素分组为逻辑分组以避免重复。 Reasons可以是自己的表,其中包含与Beliefs的一对多链接,其中包含用于区分“同意”或“不同意”的类别/类型字段。这样做,您就不需要像上面那样的联合查询。