Sql-Server

兩個 OPENJSON,在單獨的行中返回每個數組元素

  • March 17, 2022

我有一個表格,我以 JSON 格式保存產品退出和返回的數量。數據保存在兩列中out_quantityin_quantity為數組格式。

CREATE TABLE products_info (
 product_id int NOT NULL,
 out_quantity varchar(4000) DEFAULT '[]',
 in_quantity varchar(4000) DEFAULT '[]'
);

使用此查詢

SELECT product_id, o.out_date, o.out_quantity, i.in_date, i.in_quantity FROM products_info
CROSS APPLY OPENJSON (
     out_quantity
 ) WITH (
     out_date date '$.date',
     out_quantity int '$.quantity'
 ) o
CROSS APPLY OPENJSON (
     in_quantity
 ) WITH (
     in_date date '$.date',
     in_quantity int '$.quantity'
 ) i;

這就是我得到的

但我想要實現的是不要有這樣的重複數據

我知道這是使用交叉應用的預期行為,但我找不到任何其他解決方案。

小提琴手

我還有從 JOINproduct_description中獲得的其他列,例如從 table 中獲得的列products。我沒有在這個例子中添加它們

謝謝

您只需對主表進行一次掃描即可完成此操作。

SELECT pi.product_id, o.*
FROM products_info pi
CROSS APPLY (
   SELECT o.out_date, o.out_quantity, NULL in_date, NULL in_quantity
   FROM OPENJSON (
         pi.out_quantity
     ) WITH (
         out_date date '$.date',
         out_quantity int '$.quantity'
   ) o
   UNION ALL
   SELECT NULL, NULL, o.in_date, o.in_quantity
   FROM OPENJSON (
         pi.in_quantity
     ) WITH (
         in_date date '$.date',
         in_quantity int '$.quantity'
   ) o
) o;

如果您想在輸入和輸出中看到單獨的行,請使用UNION ALL

SELECT product_id, o.out_date date, o.out_quantity quantity, 'out' As Direction
FROM products_info
CROSS APPLY OPENJSON (
     out_quantity
 ) WITH (
     out_date date '$.date',
     out_quantity int '$.quantity'
 ) o
 Union ALl
 SELECT product_id, o.in_date, o.in_quantity, 'in'
FROM products_info
CROSS APPLY OPENJSON (
     in_quantity
 ) WITH (
     in_date date '$.date',
     in_quantity int '$.quantity'
 ) o

引用自:https://dba.stackexchange.com/questions/308766