Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

示例 UNION 查询

在以下 UNION 查询中,SALES 表中的行将与 LISTING 表中的行合并。从每个表中选择三个兼容的列;在这种情况下,对应的列具有相同的名称和数据类型。

最终结果集按 LISTING 表中的第一列进行排序且最多包含 5 个具有最高 LISTID 值的行。

Copy
select listid, sellerid, eventid from listing union select listid, sellerid, eventid from sales order by listid, sellerid, eventid desc limit 5; listid | sellerid | eventid --------+----------+--------- 1 | 36861 | 7872 2 | 16002 | 4806 3 | 21461 | 4256 4 | 8117 | 4337 5 | 1616 | 8647 (5 rows)

以下示例说明如何将文本值添加到 UNION 查询的输出,以便您查看哪个查询表达式生成了结果集中的每一行。查询将第一个查询表达式中的行标识为“B”(针对买家),并将第二个查询表达式中的行标识为“S”(针对卖家)。

查询标识门票事务费用等于或大于 $10000 的买家和卖家。UNION 运算符的任一侧的两个查询表达式之间的唯一差异就是 SALES 表的联接列。

Copy
select listid, lastname, firstname, username, pricepaid as price, 'S' as buyorsell from sales, users where sales.sellerid=users.userid and pricepaid >=10000 union select listid, lastname, firstname, username, pricepaid, 'B' as buyorsell from sales, users where sales.buyerid=users.userid and pricepaid >=10000 order by 1, 2, 3, 4, 5; listid | lastname | firstname | username | price | buyorsell --------+----------+-----------+----------+-----------+----------- 209658 | Lamb | Colette | VOR15LYI | 10000.00 | B 209658 | West | Kato | ELU81XAA | 10000.00 | S 212395 | Greer | Harlan | GXO71KOC | 12624.00 | S 212395 | Perry | Cora | YWR73YNZ | 12624.00 | B 215156 | Banks | Patrick | ZNQ69CLT | 10000.00 | S 215156 | Hayden | Malachi | BBG56AKU | 10000.00 | B (6 rows)

以下示例使用 UNION ALL 运算符,因为需要在结果中保留重复行(如果发现重复行)。对于一系列特定的活动 ID,查询为与每个活动关联的每个销售值返回 0 行或多个行,并为该活动的每个列表返回 0 行或 1 个行。活动 ID 对于 LISTING 和 EVENT 表中的每个行是唯一的,但对于 SALES 表中的活动和列表 ID 的相同组合,可能有多个销售值。

结果集中的第三个列标识行的来源。如果行来自 SALES 表,则在 SALESROW 列中将其标记为“Yes”。(SALESROW 是 SALES.LISTID 的别名。)如果行来自 LISTING 表,则在 SALESROW 列中将其标记为“No”。

在本示例中,结果集包含针对列表 500,活动 7787 的三个销售行。换而言之,将针对此列表和活动组合执行三个不同的事务。其他两个列表(501 和 502)不生成任何销售值,因此只有查询为这些列表 ID 生成的行来自 LISTING 表 (SALESROW = 'No')。

Copy
select eventid, listid, 'Yes' as salesrow from sales where listid in(500,501,502) union all select eventid, listid, 'No' from listing where listid in(500,501,502) order by listid asc; eventid | listid | salesrow ---------+--------+---------- 7787 | 500 | No 7787 | 500 | Yes 7787 | 500 | Yes 7787 | 500 | Yes 6473 | 501 | No 5108 | 502 | No (6 rows)

如果运行不带 ALL 关键字的相同查询,则结果只保留其中一个销售事务。

Copy
select eventid, listid, 'Yes' as salesrow from sales where listid in(500,501,502) union select eventid, listid, 'No' from listing where listid in(500,501,502) order by listid asc; eventid | listid | salesrow ---------+--------+---------- 7787 | 500 | No 7787 | 500 | Yes 6473 | 501 | No 5108 | 502 | No (4 rows)