Sql-Server
兩個 OPENJSON,在單獨的行中返回每個數組元素
我有一個表格,我以 JSON 格式保存產品退出和返回的數量。數據保存在兩列中
out_quantity
,in_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;
這就是我得到的
但我想要實現的是不要有這樣的重複數據
我知道這是使用交叉應用的預期行為,但我找不到任何其他解決方案。
我還有從 JOIN
product_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