Maison > Questions et réponses > le corps du texte
J'ai obtenu une liste d'identifiants sous forme de liste de valeurs JSON séparées par des virgules, quelques exemples d'ensembles de données sont les suivants [340596,340597,340595] Cette liste peut être énorme, parfois 50 000 identifiants, séparés par des virgules
La requête suivante connecte ces identifiants à la clé primaire de la table et obtient les enregistrements qui existent actuellement dans la table
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
La table principale peut contenir ces identifiants, ou ces enregistrements peuvent avoir été supprimés de la table principale, le but de cette requête est donc de garantir que l'ensemble de résultats renvoyé ne contient que des enregistrements actifs
J'ai dû appliquer un filtre supplémentaire à cette requête et il était basé sur un autre tableau int JSON et je devais le faire correspondre avec la colonne 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 )
Cependant, les performances de Mysql IN ne sont pas meilleures pour les grands ensembles de résultats. Pouvons-nous remplacer cet IN par quelque chose de mieux ?
P粉2519031632024-03-28 10:05:11
Vous pouvez transférer les identifiants de la clause IN dans une table temporaire, puis les joindre avec JSON_TABLE pour obtenir le résultat. Alternativement, vous pouvez utiliser CTE et vous amuser.
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;