サーチ…


セルから動的に生成された行で表の行を結合する

CROSS APPLYを使用すると、テーブルから行を「結合」することができます。

製品の配列(ProductList列)を含む列を持つCompanyテーブルと、これらの値を解析して一連の製品を返す関数があるとします。 Companyテーブルからすべての行を選択し、この関数をProductList列に適用し、親Company行との結果を「結合」することができます。

SELECT *
FROM Companies c 
     CROSS APPLY dbo.GetProductList( c.ProductList ) p

各行について、 ProductListセルの値が関数に提供され、関数はそれらの製品を親行と結合できる行の集合として返します。

JSON配列をセルに格納してテーブル行を結合する

CROSS APPLYを使用すると、テーブルの行を列に格納されたJSONオブジェクトのコレクションに「結合」できます。

JSON配列としてフォーマットされた一連の製品(ProductList列)を含む列を持つCompanyテーブルがあるとします。 OPENJSONテーブル値関数は、これらの値を解析して一連の製品を返すことができます。 Companyテーブルからすべての行を選択し、OPENJSONを使用してJSON製品を解析し、親会社の行を使用して結果を「結合」することができます。

SELECT *
FROM Companies c 
     CROSS APPLY OPENJSON( c.ProductList )
                 WITH ( Id int, Title nvarchar(30), Price money)

各行について、 ProductListセルの値は、JSONオブジェクトをWITH句に定義されたスキーマを持つ行に変換するOPENJSON関数に提供されます。

行を配列値でフィルタリングする

タグのリストをコマンドで区切った値として行に格納すると、 STRING_SPLIT関数を使用してタグのリストを値の表に変換できます。 CROSS APPLYを使用すると、 STRING_SPLIT関数で解析された値を親行と結合することができます。

カンマで区切ったタグの配列(例:promo、sales、new)を含む列を持つProductテーブルがあるとします。 STRING_SPLITとCROSS APPLYを使用すると、製品の行をタグに結びつけることができるため、商品をタグでフィルタリングできます。

SELECT *
FROM Products p 
     CROSS APPLY STRING_SPLIT( p.Tags, ',' ) tags
WHERE tags.value = 'promo'

行ごとに、 タグセルの値は、タグ値を返す関数をSTRING_SPLITに提供されます。次に、これらの値で行をフィルタリングできます。

注: STRING_SPLIT関数はSQL Server 2016より前には使用できません



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow