

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# FROM 子句
<a name="r_FROM_clause30"></a>

查询中的 FROM 子句列出从中选择数据的表引用（表、视图和子查询）。如果列出多个表引用，则必须在 FROM 子句或 WHERE 子句中使用适当的语法来联接表。如果未指定联接条件，则系统将查询作为交叉联接（笛卡尔乘积）进行处理。

**Topics**
+ [语法](#r_FROM_clause30-synopsis)
+ [参数](#r_FROM_clause30-parameters)
+ [使用说明](#r_FROM_clause_usage_notes)
+ [PIVOT 和 UNPIVOT 示例](r_FROM_clause-pivot-unpivot-examples.md)
+ [JOIN 示例](r_Join_examples.md)
+ [UNNEST 示例](r_FROM_clause-unnest-examples.md)

## 语法
<a name="r_FROM_clause30-synopsis"></a>

```
FROM table_reference [, ...]
```

其中，*table\_reference* 是下列项之一：

```
with_subquery_table_name [ table_alias ]
table_name [ * ] [ table_alias ]
( subquery ) [ table_alias ]
table_reference [ NATURAL ] join_type table_reference
   [ ON join_condition | USING ( join_column [, ...] ) ]
table_reference  join_type super_expression 
   [ ON join_condition ]
table_reference PIVOT ( 
   aggregate(expr) [ [ AS ] aggregate_alias ]
   FOR column_name IN ( expression [ AS ] in_alias [, ...] )
) [ table_alias ]
table_reference UNPIVOT [ INCLUDE NULLS | EXCLUDE NULLS ] ( 
   value_column_name 
   FOR name_column_name IN ( column_reference [ [ AS ]
   in_alias ] [, ...] )
) [ table_alias ]
UNPIVOT expression AS value_alias [ AT attribute_alias ]
( super_expression.attribute_name ) AS value_alias [ AT index_alias ]
UNNEST ( column_reference )
  [AS] table_alias ( unnested_column_name )
UNNEST ( column_reference ) WITH OFFSET
  [AS] table_alias ( unnested_column_name, [offset_column_name] )
```

可选的 *table\_alias* 可用于为表和复杂表引用指定临时名称，如果需要，也可以为其列指定临时名称，如下所示：

```
[ AS ] alias [ ( column_alias [, ...] ) ]
```

## 参数
<a name="r_FROM_clause30-parameters"></a>

 *with\_subquery\_table\_name*   
[WITH 子句](r_WITH_clause.md)中的子查询定义的表。

 *table\_name*   
表或视图的名称。

 *alias*   
表或视图的临时备用名称。必须为派生自子查询的表提供别名。在其他表引用中，别名是可选的。AS 关键字始终是可选的。表别名提供了用于标识查询的其他部分（例如 WHERE 子句）中的表的快捷方法。例如：  

```
select * from sales s, listing l
where s.listid=l.listid
```

 *column\_alias*   
表或视图中的列的临时备用名称。

 *subquery*   
一个计算结果为表的查询表达式。表仅在查询的持续时间内存在，并且通常会向表提供一个名称或*别名*。但别名不是必需的。您也可以为派生自子查询的表定义列名称。如果您希望将子查询的结果联接到其他表并且希望在查询中的其他位置选择或约束这些列，则指定列的别名是非常重要的。  
子查询可以包含 ORDER BY 子句，但在未指定 LIMIT 或 OFFSET 子句的情况下，该子句可能没有任何作用。

NATURAL   
定义一个联接，该联接自动将两个表中同名列的所有配对用作联接列。不需要显式联接条件。例如，如果 CATEGORY 和 EVENT 表都具有名为 CATID 的列，则这两个表的自然联接为基于其 CATID 列的联接。  
如果指定 NATURAL 联接，但表中没有要联接的同名列配对，则查询默认为交叉联接。

 *join\_type*   
指定下列类型的联接之一：  
+ [INNER] JOIN 
+ LEFT [OUTER] JOIN 
+ RIGHT [OUTER] JOIN 
+ FULL [OUTER] JOIN 
+ CROSS JOIN 
交叉联接是未限定的联接；它们返回两个表的笛卡尔乘积。  
内部联接和外部联接是限定的联接。它们的限定方式包括：隐式（在自然联接中）；在 FROM 语句中使用 ON 或 USING 语法；或者使用 WHERE 子句条件。  
内部联接仅基于联接条件或联接列的列表返回匹配的行。外部联接返回与内部联接相同的所有行，还返回“左侧”表和/或“右侧”表中的非匹配行。左侧表是第一个列出的表，右侧表是第二个列出的表。非匹配行包含 NULL 值以填补输出列中的空白。

ON *join\_condition*   
联接规范的类型，其中将联接列声明为紧跟 ON 关键字的条件。例如：  

```
sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
```

USING ( *join\_column* [, ...] )   
联接规范的类型，其中用圆括号将列出的联接列括起来。如果指定多个联接列，则用逗号将它们分隔开。USING 关键字必须在列表之前。例如：  

```
sales join listing
using (listid,eventid)
```

PIVOT  
将输出由行转换为列，以便以易于阅读的格式表示表格数据。在多个列中水平表示输出。PIVOT 类似于带有聚合的 GROUP BY 查询，它使用聚合表达式来指定输出格式。但是，与 GROUP BY 不同的是，它以列而非行的形式返回输出。  
有关演示如何使用 PIVOT 和 UNPIVOT 查询的示例，请参阅 [PIVOT 和 UNPIVOT 示例](r_FROM_clause-pivot-unpivot-examples.md)。

UNPIVOT  
*使用 UNPIVOT 将列旋转为行* – 此运算符将输入表或查询结果中的结果列转换为行，以使输出更易于阅读。UNPIVOT 将其输入列的数据合并为两个结果列：名称列和值列。名称列包含输入中的列名称，例如行条目。值列包含输入列中的值，例如聚合结果。例如，不同类别中的项目计数。  
*使用 UNPIVOT (SUPER) 反转置对象* - 您可以执行对象反转置，其中 *expression* 是引用另一个 FROM 子句项的 SUPER 表达式。有关更多信息，请参阅 [对象逆透视](query-super.md#unpivoting)。它还提供了一些示例，展示如何查询半结构化数据，例如 JSON 格式的数据。

*super\_expression*  
有效的 SUPER 表达式。Amazon Redshift 会为指定属性中的每个值返回一行。有关 SUPER 数据类型的更多信息，请参阅 [SUPER 类型](r_SUPER_type.md)。有关取消嵌套的 SUPER 值的更多信息，请参阅[取消嵌套查询](query-super.md#unnest)。

*attribute\_name*  
SUPER 表达式中属性的名称。

*index\_alias*  
表示值在 SUPER 表达式中位置的索引的别名。

UNNEST  
将嵌套结构（通常是 SUPER 数组）扩展为包含取消嵌套元素的列。有关取消嵌套 SUPER 数据的更多信息，请参阅[查询半结构化数据](query-super.md)。有关示例，请参阅 [UNNEST 示例](r_FROM_clause-unnest-examples.md)。

*unnested\_column\_name*  
包含取消嵌套元素的列的名称。

UNNEST ... WITH OFFSET  
将偏移列添加到取消嵌套的输出中，偏移表示数组中每个元素从零开始的索引。当您想要查看数组中元素的位置时，这个变量很有用。有关取消嵌套 SUPER 数据的更多信息，请参阅[查询半结构化数据](query-super.md)。有关示例，请参阅 [UNNEST 示例](r_FROM_clause-unnest-examples.md)。

*offset\_column\_name*  
偏移列的自定义名称，可让您显式定义索引列将在输出中的显示方式。此参数为可选的。默认情况下，偏移列的名称为 `offset_col`。

## 使用说明
<a name="r_FROM_clause_usage_notes"></a>

联接列必须具有可比较的数据类型。

NATURAL 或 USING 联接仅将每对联接列中的一个联接列保留在中间结果集中。

使用 ON 语法的联接会将两个联接列都保留在其中间结果集中。

另请参阅 [WITH 子句](r_WITH_clause.md)。