2017-08-30 9 views
0

現在、私はJSONでSQL Server 2016を使用しており、コレクションに一緒に参加したいと考えています。 (collect_addressJSONデータでSQL Server 2016で2つのコレクションを結合する

{ 
    "id" : "P1", 
    "name" : "Sarah", 
    "addresses" : { 
     "addressId" : [ 
     "ADD1", 
     "ADD2" 
     ] 
    } 
} 

JSON文書が第二のコレクションで、以下のこれらのようになります。

CREATE TABLE collect_person(person...) 
CREATE TABLE collect_address(address...) 

JSON文書は(collection_person)最初のコレクションでは、このようになります。これまでのところ私は2つのコレクションを作成しました):

{ 
    "id" : "ADD1", 
    "city" : "San Jose", 
    "state" : "CA" 
} 

{ 
    "id" : "ADD2", 
    "city" : "Las Vegas" 
    "state" : "NV" 
} 

私は「サラ」という名前の人のアドレスを取得したいので、出力は次のようになります。

{ 
    {"city" : "San Jose", "state" : "CA"}, 
    {"city" : "Las Vegas", "state" : "NV"} 
} 

JSONをSQLとSQLからJSONに変換したくありません。 JSONを使用してSQL Server 2016でこれを行うことは可能ですか?前もって感謝します。

答えて

0

以前は実際にJSONを使用したことはありませんが、コレクションを使用してコレクションに参加することはできませんでした。 JSONは、サーバーとの間でのデータ交換用に設計され、トランスポート方法として機能します。

0

私は少し遅れていますが、それはクロス適用によって行うことができます。また、共通テーブル式も使用しました。テーブルのサイズによっては、データが変更されず、レコードごとに1つのaddressIdがあると仮定したり、索引付けしたり使用したりできる他のキー値を追加すると仮定して、各テーブルのIDフィールドに永続計算列を作成することをお勧めしますJSONに変換する必要があるレコードを制限します。これは簡単な例であり、パフォーマンスについてはテストされていないので「YMMV」です。

構築例表

;WITH persons AS ( 
SELECT --JP.* 
    JP.id 
    ,JP.name 
,JPA.addressId -- Or remove the with clause for JPA and just use JPA.value as addressId  
FROM @collect_person 
CROSS APPLY OPENJSON([person]) 
    WITH (
    id varchar(50) '$.id' 
    ,[name] varchar(50) '$.name' 
    ,addresses nvarchar(max) AS JSON 
) as JP 
    CROSS APPLY OPENJSON(JP.addresses, '$.addressId') 
    WITH (
     addressId varchar(250) '$' 
    ) AS JPA 
) 
,Addresses AS (
    SELECT A.* 
    FROM @collect_address AS CA 
    CROSS APPLY OPENJSON([Address]) 
     WITH (
     id varchar(50) '$.id' 
     ,city varchar(50) '$.city' 
     ,state varchar(2) '$.state' 
    ) as A 
) 

SELECT * FROM persons 
    INNER JOIN Addresses 
    ON persons.addressId = Addresses.id 

は再び、これは、これを行うための理想的な方法ではありませんが、それは動作しますし、前に述べたように、あなたはおそらくべきテーブルを照会

DECLARE @collect_person AS TABLE 
(Person NVARCHAR(MAX)) 

DECLARE @collect_address as TABLE 
([Address] NVARCHAR(MAX)) 

INSERT INTO @collect_person (Person) 
SELECT N'{ 
    "id" : "P1", 
    "name" : "Sarah", 
    "addresses" : { 
     "addressId" : [ 
     "ADD1", 
     "ADD2" 
     ] 
    } 
}' 

INSERT INTO @collect_address ([Address]) 
VALUES 
(N'{ 
    "id" : "ADD1", 
    "city" : "San Jose", 
    "state" : "CA" 
}') 
,('{ 
    "id" : "ADD2", 
    "city" : "Las Vegas", 
    "state" : "NV" 
}') 

スキャンを制限するために索引付けされる各表にキー・フィールドがあり、JSON解析が表に対して行われます。

ネイティブ編集がありますが、それは私には新しく、賛否両論に精通していません。

Optimize JSON processing with in-memory OLTP

関連する問題