Transact-SQL を使用してウェアハウスにデータを取り込む
適用対象:✅ Microsoft Fabric のウェアハウス
Transact-SQL 言語には、レイクハウスとウェアハウス内の既存のテーブルからウェアハウス内の新しいテーブルに大規模なデータを読み込む際に使用できるオプションが用意されています。 これらのオプションは、新しい集計データを含むテーブルのバージョン、行のサブセットを含むテーブルのバージョンを作成する、または複雑なクエリの結果としてテーブルを作成する必要がある場合に便利です。 いくつかの例を見てみましょう。
CREATE TABLE AS SELECT (CTAS) の使用による、クエリの結果を使用した新しいテーブルを作成
CREATE TABLE AS SELECT (CTAS) ステートメントを使用すると、SELECT
ステートメントの出力からウェアハウスに新しいテーブルを作成できます。 これは新しいテーブルへのインジェスト操作を並列で実行するため、ワークスペースでのデータ変換と新しいテーブルの作成が非常に効率的になります。
Note
この記事の例では、Bing COVID-19 サンプル データセットを使用します。 サンプル データセットを読み込むには、「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';
ソース テーブルの updated
列から取得した値を使用して、新しい year
、month
、dayofmonth
列を含む新しいテーブルを作成することもできます。 これは、年単位で感染データを視覚化しようとしている場合や、最も COVID-19 の症例が観察された月を確認する場合に役立ちます。
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
の月により多くの診断症例が観察され、その後 December
と October
が続くことが見て取れます。 次のように April
は、全体を通して症例数が最も少ない月です。
SELECT * FROM [dbo].[infections_by_month]
WHERE [country_region] = 'United States'
ORDER BY [confirmed_sum] DESC;
その他の例と構文リファレンスについては、「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
ステートメントは、クロスウェアハウス クエリを使用することで、コピー先テーブルが保存されているウェアハウスとは異なるウェアハウス上のテーブルを参照することもできます。 これは、3 部構成の名前付け規則 [warehouse_or_lakehouse_name.][schema_name.]table_name
を使用することで実現できます。 たとえば、次に示すワークスペース資産を持っているとしましょう。
- 最新のケース データを含む
cases_lakehouse
という名前のレイクハウス。 - 参照データに使用されるテーブルを含む
reference_warehouse
という名前のウェアハウス。 - コピー先テーブルが作成される
research_warehouse
という名前のウェアハウス。
次のワークスペース資産上のテーブルのデータを結合するために、3 部構成の名前付けを使用する新しいテーブルを作成できます。
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 クエリの記述」を参照してください。