【问题标题】:SQL Server 2016 select where in json array of objects with normal tableSQL Server 2016 选择带有普通表的 json 对象数组中的位置
【发布时间】:2019-07-26 12:54:39
【问题描述】:

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

我想将一个表与另一个具有 JSON 列的表与两个字符串列进行比较。

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

它应该满足以下2个条件 Table2.Items(每个项目).product_category = Table1.product_category 和 Table2.Items(每一项).product_id = Table1.product_id

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

表 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

样本&lt;JSON_Data&gt; for 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    .....               ....

【问题讨论】:

  • 您的问题是什么?您向我们提供了一些查询,陈述了您的结果,但没有告诉我们最终目标是什么或您遇到了什么问题。
  • @Larnu 我想要一个 SQL 查询来实现这一点,我已经更新了我的问题。
  • 那么您的预期结果是什么?到目前为止,您尝试过什么?
  • 最后一张表是预期的结果,我尝试使用打开的 JSON 但不工作
  • 请向我们展示您的尝试。如果我们没有您的查询,我们无法告诉您出了什么问题。 “不工作”是什么意思?

标签: sql-server join json-query


【解决方案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

【讨论】:

  • 非常感谢您的努力和帮助,这个查询解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多