使用 Transact-SQL 将数据引入仓库

适用于:✅Microsoft Fabric 中的仓库

Transact-SQL 语言提供了一些选项,可用于将数据从湖屋和仓库中的现有表大规模地加载到仓库中的新表中。 如果需要创建包含聚合数据的表的新版本、包含行子集的表版本,或者由于复杂查询而创建表,这些选项非常方便。 让我们举例说明。

使用查询结果和 CREATE TABLE AS SELECT (CTAS) 创建新表

通过 CREATE TABLE AS SELECT (CTAS) 语句,可根据 SELECT 语句的输出在仓库中创建新表。 它会并行运行将数据引入到新表的操作,使其在转换数据和在工作区中创建新表方面非常高效。

注意

本文中的示例使用必应中的新冠肺炎示例数据集。 若要加载示例数据集,请按照使用 COPY 语句将数据引入仓库中的步骤操作,将示例数据创建到仓库中。

第一个示例演示如何创建一个新表,该表是现有 dbo.[bing_covid-19_data_2023] 表的副本,但仅筛选到 2023 年的数据:

CREATE TABLE [dbo].[bing_covid-19_data_2023]
AS
SELECT * 
FROM [dbo].[bing_covid-19_data] 
WHERE DATEPART(YEAR,[updated]) = '2023';

还可创建具有新的 yearmonthdayofmonth 列的新表,其中包含从源表中的 updated 列获取的值。 如果尝试按年份直观显示感染数据,或者查看观察到最多新冠肺炎病例的月份,这非常有用:

CREATE TABLE [dbo].[bing_covid-19_data_with_year_month_day]
AS
SELECT DATEPART(YEAR,[updated]) [year], DATEPART(MONTH,[updated]) [month], DATEPART(DAY,[updated]) [dayofmonth], * 
FROM [dbo].[bing_covid-19_data];

另一个示例是,你可以创建一个新表,来汇总每月观察到的病例数,而不考虑年份,以评估季节性如何影响在给定国家/地区的传播。 它使用在上一示例中创建的表,并将新的 month 列作为源:

CREATE TABLE [dbo].[infections_by_month]
AS
SELECT [country_region],[month], SUM(CAST(confirmed as bigint)) [confirmed_sum]
FROM [dbo].[bing_covid-19_data_with_year_month_day]
GROUP BY [country_region],[month];

根据这个新表,我们可以看到,美国在所有年份的 January 观察到了更多的确诊病例,其次是 DecemberOctoberApril 是总体病例数最少的月份:

SELECT * FROM [dbo].[infections_by_month]
WHERE [country_region] = 'United States'
ORDER BY [confirmed_sum] DESC;

查询结果的屏幕截图,显示美国按月份列出的感染人数,数据按月份降序排序。顶部显示月份编号 1。

有关更多示例和语法参考,请参阅 CREATE TABLE AS SELECT (Transact-SQL)

使用 T-SQL 查询将数据引入现有表

前面的示例基于查询结果创建新表。 若要复制示例(现有表上的示例除外),可使用 INSERT...SELECT 模式。 例如,以下代码将新数据引入现有表:

INSERT INTO [dbo].[bing_covid-19_data_2023]
SELECT * FROM [dbo].[bing_covid-19_data] 
WHERE [updated] > '2023-02-28';

SELECT 语句的查询条件可以是任何有效的查询,只要生成的查询列类型与目标表上的列一致就行。 如果指定了列名,并且仅包含目标表中列的子集,则所有其他列都加载为 NULL。 有关详细信息,请参阅使用 INSERT INTO…SELECT,在最小程度的日志记录和并行度情况下批量导入数据

从不同仓库和湖屋上的表引入数据

对于 CREATE TABLE AS SELECT 和 INSERT...SELECT,SELECT 语句还可使用跨仓库查询来引用与存储目标表的仓库不同的仓库中的表。 这可以通过使用由三部分构成的命名约定 [warehouse_or_lakehouse_name.][schema_name.]table_name 来实现。 例如,假设你具有以下工作区资产:

  • 一个名为 cases_lakehouse 的湖屋,其中包含最新的病例数据。
  • 一个名为 reference_warehouse 的仓库,其中包含用于引用数据的表。
  • 一个名为 research_warehouse 的仓库,在其中创建目标表。

可以创建一个新表,该表使用三部分命名来合并这些工作区资产上的表中的数据:

CREATE TABLE [research_warehouse].[dbo].[cases_by_continent]
AS
SELECT 
FROM [cases_lakehouse].[dbo].[bing_covid-19_data] cases
INNER JOIN [reference_warehouse].[dbo].[bing_covid-19_data] reference
ON cases.[iso3] = reference.[countrycode];

若要详细了解跨仓库查询,请参阅编写跨数据库 SQL 查询