连接 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 个主表有多行,但主数据重复的主要内容,如果未能解决你的问题,请参考以下文章

一条sql 俩个表级联查询的语句,我想只显示前七条,从表有一个字段是和主表对应的。要求一起显示。。。。

多个关联表多字段多条件模糊查询

将 5 个表数据合并到主表中

如何连接仍保留主表中所有值的表

多表关联查询时,返回主表全部数据

查询从 3 个表中获取数据,主表和总和列从彼此 2 个表中获取