连接 5 个表 - 1 个主表加上 4 个主表有多行,但主数据重复
Posted
技术标签:
【中文标题】连接 5 个表 - 1 个主表加上 4 个主表有多行,但主数据重复【英文标题】:Joining 5 tables - 1 master plus 4 with multiple rows to the master but master data is duplicated 【发布时间】:2014-01-04 11:46:51 【问题描述】:我正在使用 mysql 进行查询,但我对此并不陌生。我要加入 5 个表,其中每个表都有一个标识符,一个表是主表。每个相关表可能有多个与主表相关联的记录。我正在尝试加入这些表,但我似乎无法摆脱重复的数据。
我希望显示所有相关记录,但我不希望主表中的数据显示相关表中的所有结果。我尝试了很多不同的方法,但没有任何效果。目前我有 4 个查询适用于单独的表,但我没有成功加入它们以使结果显示相关表中的多条记录,但只显示主表中的一条记录。
以下是我个人的有效查询:
SELECT
GovernmaxAdditionsExtract.AdditionDescr,
GovernmaxAdditionsExtract.BaseArea,
GovernmaxAdditionsExtract.Value
FROM
GovernmaxExtract
INNER JOIN GovernmaxAdditionsExtract
ON GovernmaxExtract.mpropertyNumber = GovernmaxAdditionsExtract.PropertyNumber
WHERE (((GovernmaxExtract.mpropertyNumber)="xxx-xxx-xx-xxx"));
SELECT
GovernmaxExtract.mpropertyNumber,
GovernmaxDwellingExtract.CardNumber,
GovernmaxDwellingExtract.MainBuildingType,
GovernmaxDwellingExtract.BaseArea
FROM
GovernmaxExtract INNER JOIN
GovernmaxDwellingExtract ON GovernmaxExtract.mpropertyNumber = GovernmaxDwellingExtract.PropertyNumber
WHERE (((GovernmaxExtract.mpropertyNumber)="xxx-xxx-xx-xxx"));
使用这些子查询,我尝试将 2 个表放在一起,但现在我正在取回所有记录并且它没有读取我的输入参数:
SELECT GE.mpropertynumber
FROM
GovernmaxExtract AS GE,
(SELECT
GovernmaxAdditionsExtract.AdditionDescr,
GovernmaxAdditionsExtract.BaseArea,
GovernmaxAdditionsExtract.Value
FROM GovernmaxExtract INNER JOIN
GovernmaxAdditionsExtract ON
governmaxextract.mpropertyNumber = GovernmaxAdditionsExtract.PropertyNumber) AS AE
WHERE GE.mpropertynumber = 'xxx-xxx-xx-xxx'
我尝试了嵌套查询、许多不同的连接,但我无法解决这个问题。我很确定我想做一个嵌套查询,因为我希望 Governmax
表中的主要数据与主要数据和所有记录一起显示一次,其中包含关联表的所有信息。也许我做错了。
我们原来的代码是:
SELECT
ge.*,
gde.*,
gfe.*,
gae.*,
goie.*
FROM governmaxextract AS ge
LEFT JOIN governmaxdwellingextract AS gde
ON ge.mpropertyNumber = gde.PropertyNumber
LEFT JOIN governmaxfeaturesextract AS gfe
ON gde.PropertyNumber = gfe.PropertyNumber
LEFT JOIN governmaxadditionsextract AS gae
ON gde.PropertyNumber = gae.PropertyNumber
RIGHT JOIN governmaxotherimprovementsextract AS goie
ON gde.PropertyNumber = goie.PropertyNumber
WHERE ge.mpropertyNumber = '$codeword'
ORDER BY goie.CardNumber
但这会为关联表中的每条记录提供主表中的多行。我考虑过连接,但我需要单独显示关联表中的数据。不知道接下来要尝试什么。非常感谢任何帮助。
【问题讨论】:
您应该首先看到您的表格关系。因为如果你至少有一个 1-N 关系,你就会有重复的数据。 【参考方案1】:为了在不生成重复行的情况下将两个 Detail 表连接在一起,您必须对每个表执行以下操作:
对主表的外键进行分组,并聚合投影到连接上的所有其他列。
数值列通常使用 SUM()、COUNT()、MAX() 和 MIN() 聚合。 MAX() 和 MIN() 也适用于字符数据。在这种情况下,PIVOT 操作有时也可用作聚合运算符。
一旦您有两个以这种方式分组和聚合的详细信息表,它们将无重复地连接。通过首先以相同的方式对它们进行分组和聚合,可以将其他详细信息表添加到连接中。
【讨论】:
【参考方案2】:抱歉,没有办法如你所愿。 JOIN 做不到。
我建议保留单独查询的解决方案。
顺便说一句-您可以使用 UNION 运算符, http://en.wikipedia.org/wiki/Union_(SQL)#UNION_operator
附言
您可以单独提取主要数据,然后使用 UNION 一次从相关表中提取数据。使用 UNIOM,它将为相关表中的每一行提供一个结果行。
【讨论】:
以上是关于连接 5 个表 - 1 个主表加上 4 个主表有多行,但主数据重复的主要内容,如果未能解决你的问题,请参考以下文章