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

Sql 在MS Access中,我从表的查询中得到了意外的结果,sql,ms-access,Sql,Ms Access,我有以下表格和以下字段: BeliefT(BeliefID,信念,主题,主题2,主题3,主题4) ArgumentAgreeT(ReasonToAgreeID、ConclusionA、reasontoagree)这些字段的值来自对BeliefT.BeliefID和BeliefT.beliefids的查找 argumentdisagreeid(ReasonToDisagreeID,ConclusionD,ReasonToDisagreeID)这些字段的值也来自对BeliefT.BeliefID和

我有以下表格和以下字段:

  • BeliefT(BeliefID,信念,主题,主题2,主题3,主题4)
  • ArgumentAgreeT(ReasonToAgreeID、ConclusionA、reasontoagree)
    这些字段的值来自对
    BeliefT.BeliefID
    BeliefT.beliefids
    的查找
  • argumentdisagreeid(ReasonToDisagreeID,ConclusionD,ReasonToDisagreeID)
    这些字段的值也来自对
    BeliefT.BeliefID
    BeliefT.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语句包括第一个表中的前两个内容,以及第二个和第三个表中的
同意原因
不同意原因
。从SQL语句中可以看出,连接类型是一个箭头,从
BeliefT.BeliefID
指向
ArgumentsAgreeT.ConclusionA
ArgumentsDisagreeT.ConclusionD

问题是如果同意的理由不止一个,而且只有一个不同意的理由,那么它会对每个同意的理由重复不同意的理由。在另一种情况下,我的
agree
表(
ArgumentAgreeT
)有5条记录。我的表只有2条记录。无论何时
Agree
表中有一条记录,它都会复制我的disagree表中的一条记录

谢谢你的帮助

首先,这里没有在同一个查询中使用不同别名的同一个表的多个引用

其次,SQL查询在技术上是根据相应的键从多个集合(联接表)返回组合集合(查询)。因此,是的,当重复记录与另一个表配对时,它们将显示为特定的组合集。在同一个BeliefID上使用5 X 2,自然会为每个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];
还有,你期望结果是什么?查询返回的数据不会少于存在的数据。请注意,整行不是重复的(尽管记录在列中重复),因为每个返回的组合都是不同的。因此,即使使用
独特的
也不起作用

可能,您希望运行一个联合查询,以堆叠同意和不同意项,因为并排返回的每个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];

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

乍一看:您查询的语法是错误的,我指的是
(…)
中的部分。使用from子句中的大括号是无效的,您应该提供示例数据和所需结果。但是,我不确定MS Access是否真的足够强大,能够满足您的实际需要。re:“另外,您希望得到什么结果?”我想使用查询生成一个表单。该表格将在页面顶部显示结论,所有同意的原因将显示在其下方的一列中,所有不同意的原因将显示在其下方的另一列中……如果有两个同意的原因,它将显示两个……如果只有一个不同意的原因,它将只显示一个……re:“原因可能是它自己的表格”假设你在争论第二次世界大战。你可以说德国在做坏事是参战的“理由”(结论)……但你也可以说“德国在做坏事”是它自己的结论,有理由支持它。如果你加强了这个数据库中的一个论点,我希望它也加强了基于这个论点的所有结论。所以我认为每个结论都必须有能力成为支持其他结论的论据……有没有办法我仍然可以做我想做的?我将如何构造数据?