0

请帮助我使用 sql 查询来满足以下要求

我想将一个表与另一个表连接起来,该表具有一个带有两个字符串列比较的 JSON 列。

此查询适用于我想将表 2 与表 1 连接起来的 Azure SQL DB

它应满足以下 2 个条件 Table2.Items(each item).product_category = Table1.product_category 和 Table2.Items(each item).product_id = Table1.product_id

并希望通过将 JSON 项目中的每个项目扩展为行来获取表二中的所有项目和列

表格1

product_category    product_name    product_id  product_cost
Gift                Glass           157         85
Electronics         Bulb            833         218
Kitchen             Glass           157         75

表 2

Order_ID    Pincode Order_details   Email
HASDUI2N342 766815  <JSON_Data>     user1@domain.com
ASDIJ234HJI 487957  <JSON_Data>     user2@domain.com
ASDOI23480H 512878  <JSON_Data>     user2@domain.com

<JSON_Data>order_id示例HASDUI2N342

{
  "order_date": "26-07-2019",
  "Items": [
    {
      "product_category": "Gift",
      "product_id": "157"
    },
    {
      "product_category": "Electronics",
      "product_id": "833"
    }
  ],
  "amount_paid": 333,
  "shipping" :  30

}

以下是加入两者后的预期结果表

Order_ID    Pincode Email               Item.product_Name   Item.product_cost
HASDUI2N342 766815  user1@domain.com    Glass               85
HASDUI2N342 766815  user1@domain.com    Bulb                218
ASDIJ234HJI 487957  user2@domain.com    .....               ....
ASDIJ234HJI 487957  user2@domain.com    .....               ....
ASDOI23480H 512878  user3@domain.com    .....               ....
4

1 回答 1

1

您需要使用OPENJSON()显式架构定义和适当的连接:

表:

CREATE TABLE Table1 (
   product_category nvarchar(50),
   product_name nvarchar(50),    
   product_id int,  
   product_cost int
)
INSERT INTO Table1
   (product_category, product_name, product_id, product_cost)
VALUES   
   (N'Gift'        , N'Glass', 157, 85),
   (N'Electronics' , N'Bulb' , 833, 218),
   (N'Kitchen'     , N'Glass', 157, 75)
CREATE TABLE Table2 (
   Order_ID nvarchar(100),
   Pincode int,
   Order_details nvarchar(max),
   Email nvarchar(100)
)
INSERT INTO Table2
   (Order_ID, Pincode, Order_details, Email)
VALUES
   (
   N'HASDUI2N342',
   766815,
   N'{
  "order_date": "26-07-2019",
  "Items": [
    {
      "product_category": "Gift",
      "product_id": "157"
    },
    {
      "product_category": "Electronics",
      "product_id": "833"
    }
  ],
  "amount_paid": 333,
  "shipping" :  30
   }',
   N'user1@domain.com'
   )

陈述:

SELECT 
   t2.Order_ID, t2.Pincode, t2.Email,
   t1.product_name, t1.product_cost
FROM Table2 t2
CROSS APPLY OPENJSON(t2.Order_details, '$.Items') WITH (
   product_id nvarchar(100) '$.product_id',
   product_category nvarchar(100) '$.product_category'
) j
LEFT JOIN Table1 t1 ON (j.product_id = t1.product_id) AND (j.product_category = t1.product_category)

输出:

Order_ID    Pincode Email               product_name    product_cost
HASDUI2N342 766815  user1@domain.com    Glass           85
HASDUI2N342 766815  user1@domain.com    Bulb            218
于 2019-07-26T13:25:25.943 回答