【问题标题】:Microsoft Access/SQL - Query to combine rows from incomplete tablesMicrosoft Access/SQL - 查询以组合来自不完整表的行
【发布时间】:2013-11-07 08:32:24
【问题描述】:

我有几个数据源,每个数据源都提供了一个事实。为了了解全貌,我需要能够编写一个查询,将所有来源的数据组合到一个表中。我拥有的数据很复杂,所以我将提供一个简单的示例来尝试理解这个概念。

我已经给出了 Table1 和 Table2。我需要将它们组合起来以填补空白并创建一个主数据源(表 3)。假设将始终提供序列号。

表1(给定)

序列号 1 名称 1 城市 1 国家 1 操作系统 1 123 pc-123 windows 7 124 pc-124 坦帕美国 Windows XP 125 pc-125 悉尼 AU Windows 7 126 坦佩 美国

表2(给定)

序列号 2 名称 2 城市 2 国家 2 OS2 123 pc-123 美国亚特兰大 124 美国 Windows XP 125 126 pc-126 Windows XP


Table3(我要创建的)

序列名 城市 国家 操作系统 123 pc-123 亚特兰大美国 windows 7 124 pc-124 坦帕美国 Windows XP 125 pc-125 悉尼 AU Windows 7 126 pc-126 坦佩美国 Windows XP


是否有一个简单的联合、左连接、我可以编写的 SQL 组合来执行这个?我一直在寻找论坛,但找不到像这样的东西。在此先感谢您的帮助!

【问题讨论】:

  • 数据冲突怎么办?

标签: sql ms-access


【解决方案1】:

如果 serial 是唯一的(意味着每个序列的每个表中有 0..1 行并且它们始终相关)并且您不在乎在冲突中获得的值,您可以执行以下操作:

SELECT serial, MAX(name) AS name, MAX(city) AS city, 
    MAX(country) AS country, MAX(OS) AS OS
FROM (
    SELECT serial1 AS serial, name1 AS name, city1 AS city, 
        country1 AS country, OS1 AS OS
    FROM Table1
    UNION ALL
    SELECT serial2 AS serial, name2 AS name, city2 AS city, 
        country2 AS country, OS2 AS OS
    FROM Table2
) AS x
GROUP BY serial

【讨论】:

  • 我收到一个错误 - 查询定义的 SELECT 列表中的别名“名称”导致循环引用。有什么想法吗?
  • 嗯...不知道为什么。派生表查询是否单独工作?
  • 通过不重新使用字段名称作为Max() 表达式的别名来避免循环引用错误。 SELECT Max([name]) AS MaxOfName ... 等等。
  • 感谢 lc。对于解决方案,并感谢 HansUp 的修复。这个解决方案将为我节省大量时间和精力。如果我想添加第三个表等等,我可以简单地添加另一个 UNION ALL 和 SELECT 语句吗?
  • 另外,正如你上面提到的,当数据冲突时,这段代码会取哪个值?查看我的实际数据,它似乎来回走动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 2017-07-04
  • 1970-01-01
相关资源
最近更新 更多