我得到了一個 ID 串列,以逗號分隔的 JSON 值串列,一些示例資料集如下所示 [340596,340597,340595] 這個串列可能很大,有時 50k ID 由逗號分隔
以下查詢將這些 ID 連接到表主鍵并獲取表中當前存在的記錄
SELECT s.id,s.contactid, s.Quantity FROM
JSON_TABLE('[340596,340597,340595]', '$[*]' columns (Id int path '$')) AS sm
LEFT JOIN mastertable s ON s.Id = sm.id
主表可能包含這些 ID,或者可能這些記錄已從主表中洗掉所以此查詢的目的是確保回傳結果集僅包含活動記錄
我必須對此查詢再應用一次過濾,并且過濾基于另一個 JSON int 陣列,并且需要將其與 ContactID 列匹配
SELECT s.id,s.contactid, s.Quantity FROM
JSON_TABLE('[340596,340597,340595]', '$[*]' columns (Id int path '$')) AS sm
LEFT JOIN mastertable s ON s.Id = sm.id
WHERE s.ContactId IN (
SELECT cm.id FROM
JSON_TABLE('[12345,450597,640595]', '$[*]' columns (Id int path '$')) AS cm
)
然而,對于大型結果集,Mysql IN 的性能并不好。我們可以用其他更好的方法替換這個 IN 嗎?
uj5u.com熱心網友回復:
您可以將 IN 子句中的 id 轉儲到臨時表中,然后將它們與 JSON_TABLE 連接以獲得結果。或者,您可以使用 CTE 并加入它。
with temp as (
SELECT cm.id FROM
JSON_TABLE('[12345,450597,640595]', '$[*]' columns (Id int path '$')) AS cm
)
SELECT s.id,s.contactid, s.Quantity FROM
JSON_TABLE('[340596,340597,340595]', '$[*]' columns (Id int path '$')) AS sm
LEFT JOIN mastertable s ON s.Id = sm.id
INNER JOIN temp t ON s.ID = t.id;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/467564.html
標籤:mysql
