【问题标题】:How to join multiple tables with one table?如何将多个表与一张表连接起来?
【发布时间】:2017-12-06 17:00:50
【问题描述】:

我正在处理一个 SQL 项目,但在从数据库中检索数据时发现了一个问题。您可以在以下屏幕截图中看到四个表:

所以我的查询是关于计算表 transac_EUR_M10_17transac_EUR_M09_17 中的单位总和。

我尝试了以下 SQL Server 查询,但结果为假:

SELECT cntry.cod_country
    , rg.nom_region
    , SUM(tr.unite) as [sum units M09]
    , SUM(tr1.unite) as [sum units M10]   
FROM [Backup].[dbo].[transac_EUR_M09_17] as tr    
INNER JOIN [Backup].[dbo].[COUNTRY] as cntry ON tr.[cod_country] = cntry.[cod_country]  
INNER JOIN [Backup].[dbo].Region as rg   ON rg.[cod_country] = cntry.[cod_country]  
INNER JOIN [Backup].[dbo].[transac_EUR_M10_17] AS tr1  ON tr1.[cod_country] = cntry.[cod_country]
where tr.cod_region = rg.cod_region 
    AND tr1.cod_region = rg.cod_region 
Group BY cntry.cod_country
    , rg.nom_region   
ORDER BY SUM(tr.unite)
    , SUM(tr1.unite) DESC

对于如何将两张表与一张永久表连接起来,您有什么建议吗?

【问题讨论】:

  • “结果为假”是什么意思?我认为这意味着这些值不是您想要的。但我们不知道你得到了什么或你期望得到什么。这是一个很好的起点。 stackoverflow.com/help/mcve 还有spaghettidba.com/2015/04/24/…
  • 我们真的需要一些 DDL 和 Sample 数据来配合这个。有很多关于如何提供它的指南,例如SSC。当您说您的结果是“错误的”时,为什么它们不是您的预期? 我在冒险猜测,也许其中存在 一对多关系,这导致数据呈指数级增长。
  • 你能解释一下吗,how to join 2 tables with one permenant table 你想做什么。如果您需要更多帮助,则必须使用示例数据和架构。
  • 我可以用这篇文章表达我对 StackOverflow 编辑系统的不满吗?我有多少次会花 3 到 5 分钟来编辑一篇文章,然后因为队列中有另一个编辑而让网站停止?真是令人沮丧,而且浪费时间。
  • 如果您不提供信息,我们如何提供帮助。我们无法读懂你的想法。你想做什么???样本输入在哪里???预期输出在哪里???这是有关如何提问的好信息。 stackoverflow.com/help/how-to-ask

标签: sql sql-server sql-server-2014


【解决方案1】:

查看您的数据图,我会稍微不同地构建我的代码,以确保获得所需的结果。

首先按国家和地区加入 2 个主表 然后使用国家和地区表进行过滤,省略任何 where 子句,因为您在连接子句中包含所有条件。

像这样

SELECT cntry.cod_country
    , rg.nom_region
    , SUM(tr.unite) as [sum units M09]
    , SUM(tr1.unite) as [sum units M10]   
FROM [Backup].[dbo].[transac_EUR_M09_17] as tr    
INNER JOIN [Backup].[dbo].[transac_EUR_M10_17] AS tr1  ON tr1.[cod_country] = tr.[cod_country]
                                                       AND tr1.[cod_region] = tr.[cod_region]
INNER JOIN [Backup].[dbo].[COUNTRY] as cntry ON tr.[cod_country] = cntry.[cod_country]  
INNER JOIN [Backup].[dbo].Region as rg   ON rg.[cod_country] = cntry.[cod_country]  
                                        AND rg.[cod_region] = tr.[cod_region]
Group BY cntry.cod_country, rg.nom_region   
ORDER BY SUM(tr.unite), SUM(tr1.unite) DESC

这仍然可能不会产生您想要的结果,但从您给出的结果来看,它应该正确地加入您的表格。

【讨论】:

    【解决方案2】:

    除非 cod_country 是唯一列,否则这些连接必然会导致重复列。

    如果您在 09_17 有 2 行具有相同的国家/地区,而在 10_17 有相同的事物,它将在第一个表中复制两行以进行复制,从而弄乱您的总和。

    编辑:这同样适用于您加入的任何其他表

    【讨论】: