我有以下表格,其中包含以下字段:
BeliefT (BeliefID, Beliefs, Topic, Topic2, Topic3, Topic4)
ArgumentAgreeT (ReasonToAgreeID, ConclusionA, Reason to agree)
这些字段的值来自对BeliefT.BeliefID
和BeliefT.Beliefs
的查找。ArgumentDisagreeT (ReasonToDisagreeID, ConclusionD, Reason to Disagree)
这些字段的值也来自对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语句包括第一个表中的前两个内容,以及第二个和第三个表中的Reason to agree
和Reason to Disagree
。从SQL语句可以看出,连接类型是一个从BeliefT.BeliefID
指向ArgumentsAgreeT.ConclusionA
和ArgumentsDisagreeT.ConclusionD
的箭头
问题在于如果有多个理由同意,并且只有一个理由不同意,那么它会重复出于不同意的理由而不同意。在其他我的agree
表(ArgumentAgreeT
)中有5条记录。我的不同意表只有2条记录。每当有Agree
表中的记录时,它就会从我不同意的表中复制单个记录。
感谢您的帮助!
答案 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
的一对多链接,其中包含用于区分“同意”或“不同意”的类别/类型字段。这样做,您就不需要像上面那样的联合查询。