使用联合查询将多个查询合并到单个结果中 黄金假案涉案信托处理结果查询不到
如果要联合的查询有很大不同,则可能会遇到输出字段必须合并不同类型数据的情况。 如果是这种情况,联合查询通常会将结果作为文本数据类型返回,因为该数据类型可以同时包含文本和数字。
为了解其工作原理,我们将使用 Northwind 示例数据库中的产品事务联合查询。 打开该示例数据库,然后在数据表视图中打开产品事务查询。 最后十条记录应该与以下输出类似:
产品 ID
订单日期
公司名称
交易记录
数量
77
2006/1/22
供应商 B
购买
60
80
2006/1/22
供应商 D
购买
75
81
2006/1/22
供应商 A
购买
125
81
2006/1/22
供应商 A
购买
200
7
2006/1/20
公司 D
销售
10
51
2006/1/20
公司 D
销售
10
80
2006/1/20
公司 D
销售
10
34
2006/1/15
公司 AA
销售
100
80
2006/1/15
公司 AA
销售
30
假设你希望将“数量”字段一分为二 - 购买和销售。 假设你还想要为没有值的字段设置固定的零值。 以下是 SQL 查找此联合查询的方式:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As SellFROM [Product Orders]UNIONSELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As SellFROM [Product Purchases]ORDER BY [Order Date] DESC;如果切换到数据表视图,你将看到最后十条记录现在显示如下:
产品 ID
订单日期
公司名称
交易记录
购买
销售
74
2006/1/22
供应商 B
购买
20
0
77
2006/1/22
供应商 B
购买
60
0
80
2006/1/22
供应商 D
购买
75
0
81
2006/1/22
供应商 A
购买
125
0
81
2006/1/22
供应商 A
购买
200
0
7
2006/1/20
公司 D
销售
0
10
51
2006/1/20
公司 D
销售
0
10
80
2006/1/20
公司 D
销售
0
10
34
2006/1/15
公司 AA
销售
0
100
80
2006/1/15
公司 AA
销售
0
30
继续此示例,如果想要带零的字段为空? 可以通过添加 Null 关键字来修改 SQL 以不显示任何内容而不是显示零,如下所示:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As SellFROM [Product Orders]UNIONSELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As SellFROM [Product Purchases]ORDER BY [Order Date] DESC;但是,如你所见切换到数据表视图,现在有一个意外的结果。 在“购买”列中,每个字段都被清除了:
产品 ID
订单日期
公司名称
交易记录
购买
销售
74
2006/1/22
供应商 B
购买
77
2006/1/22
供应商 B
购买
80
2006/1/22
供应商 D
购买
81
2006/1/22
供应商 A
购买
81
2006/1/22
供应商 A
购买
7
2006/1/20
公司 D
销售
10
51
2006/1/20
公司 D
销售
10
80
2006/1/20
公司 D
销售
10
34
2006/1/15
公司 AA
销售
100
80
2006/1/15
公司 AA
销售
30
发生这种情况是因为 Access 会决定第一个查询中字段的数据类型。 在此示例中,Null 不是数字。
那么,如果尝试为字段的空白值插入空字符串,会发生什么呢? 此尝试的 SQL 可能如下所示:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As SellFROM [Product Orders]UNIONSELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As SellFROM [Product Purchases]ORDER BY [Order Date] DESC;当切换到数据表视图时,会看到 Access 检索“购买”值,但它会将值转换为文本。 可以看出这些是文本值,因为它们在数据表视图中是左对齐的。 第一个查询中的空字符串不是数字,这就是看到这些结果的原因。 此外还会发现,由于购买记录包含空字符串,“销售”值也会转换为文本。
产品 ID
订单日期
公司名称
交易记录
购买
销售
74
2006/1/22
供应商 B
购买
20
77
2006/1/22
供应商 B
购买
60
80
2006/1/22
供应商 D
购买
75
81
2006/1/22
供应商 A
购买
125
81
2006/1/22
供应商 A
购买
200
7
2006/1/20
公司 D
销售
10
51
2006/1/20
公司 D
销售
10
80
2006/1/20
公司 D
销售
10
34
2006/1/15
公司 AA
销售
100
80
2006/1/15
公司 AA
销售
30
那么如何解决此难题?
一个解决方案是强制查询期望字段值为数字。 这可以通过以下表达式来实现:
IIf(False, 0, Null)要检查的条件,False 永远不会为 True,因此表达式将始终返回 Null,但 Access 仍会计算两个输出选项并决定输出为数字或 Null。
以下是在我们的工作示例中使用此表达式的方法:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As SellFROM [Product Orders]UNIONSELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As SellFROM [Product Purchases]ORDER BY [Order Date] DESC;请注意,不需要修改第二个查询。
如果切换到数据表视图,现在将看到我们希望的结果:
产品 ID
订单日期
公司名称
交易记录
购买
销售
74
2006/1/22
供应商 B
购买
20
77
2006/1/22
供应商 B
购买
60
80
2006/1/22
供应商 D
购买
75
81
2006/1/22
供应商 A
购买
125
81
2006/1/22
供应商 A
购买
200
7
2006/1/20
公司 D
销售
10
51
2006/1/20
公司 D
销售
10
80
2006/1/20
公司 D
销售
10
34
2006/1/15
公司 AA
销售
100
80
2006/1/15
公司 AA
销售
30
实现相同效果的另一种方法是使用另一个查询在联合查询的前面预置这些查询:
SELECT 0 As [Product ID], Date() As [Order Date], "" As [Company Name], "" As [Transaction], 0 As Buy, 0 As SellFROM [Product Orders]WHERE False对于每个字段,Access 会返回你定义的数据类型的固定值。 当然,你不希望此查询的输出干扰结果,所以避免此情况的技巧是包含一个结果为 False 的 WHERE 子句:
WHERE False这是一个小技巧,因为这始终是假的,然后查询不会返回任何内容。 合并此语句和现有的 SQL,我们得到一个完整的语句,如下所示:
SELECT 0 As [Product ID], Date() As [Order Date], "" As [Company Name], "" As [Transaction], 0 As Buy, 0 As SellFROM [Product Orders]WHERE FalseUNIONSELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As SellFROM [Product Orders]UNIONSELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As SellFROM [Product Purchases]ORDER BY [Order Date] DESC;注意: 本示例使用 Northwind 数据库,示例中的合并查询返回 100 条记录,而两条单独的查询返回 58 条和 43 条记录(总计 101 条记录)。 产生此差异的原因是两条记录不是唯一的。 请参阅使用 UNION ALL 在联合查询中处理不同的记录部分,了解如何使用 UNION ALL 解决此情况。
版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。