2017-02-19 3 views
4

Je suis nouveau à ServiceNow mais je sais SQL et il est tout simplement pas logique que je ne pouvais pas trouver un exemple de requête simple pour ServiceNow sur leur officiel site et google. Y a-t-il un moyen pour JOIN ou simplement de vérifier si le champ X du tableau 1 est égal au champ Y de la table 2?ServiceNow - comment écrire une requête select récupérer des valeurs de 2 tables

Exemple: J'ai 2 tables, entreprises et utilisateurs, et j'ai besoin de "SELECT" tous les utilisateurs qui travaillent à Londres. Dans la table des utilisateurs, j'ai un champ 'company_name' et dans la table des entreprises j'ai les champs company_name et city.

Dans SQL je pouvais résoudre avec requête simple comme:

SELECT u.* from users u, companies c 
WHERE u.company_name = c.company_name and c.city = 'London' 

ou avec JOIN:

SELECT u.* from users u 
LEFT JOIN companies c on u.company_name = c.company_name 
WHERE c.city = 'London' 

Comment faire cela dans ServiceNow? Merci

Répondre

3

Les champs de référence gérer cela pour vous.

Si vous utilisez les tables hors de la boîte à ServiceNow pour l'utilisateur (sys_user) et société (core_company), ils sont liés par un champ de référence sur l'utilisateur (sys_user.company).

Avec des champs de référence (essentiellement les clés étrangères), vous pouvez utiliser la marche-point pour interroger à travers un champ de référence à la requête sur les champs de l'enregistrement référencé. La requête GlideRecord pour récupérer tous les utilisateurs dans une entreprise située à Londres ressemblerait à ceci:

var user = new GlideRecord('sys_user'); 
user.addQuery('company.city', 'London'); 
user.query(); 
while (user.next()) { 
    gs.info("User: " + user.user_name); 
    gs.info("Company: " + user.company.name); 
    gs.info("Company Address: " + user.company.street); 
    gs.info("Company City: " + user.company.city); 
} 

Vous pouvez faire la même chose avec l'interrogation par URL codées:

yourinstance.service-now.com/sys_user_list.do?sysparm_query=company.city=London 

Soit la requête GlideRecord ou les URL finissent par produire encodée SQL sous le capot qui ne le vous joignez vous cherchez (vous pouvez activer le débogage de la session de débogage SQL en tant qu'administrateur pour voir le SQL généré):

SELECT ... 
FROM sys_user LEFT JOIN 
     core_company ON sys_user.company = core_company.sys_id 
WHERE core_company.city = 'London' 

Maintenant, vous ne pouvez pas réellement utiliser ces tables OOB, mais les relations que vous essayez d'interroger contre l'utilisation des jointures seraient résolus avec des champs de référence configurés de façon similaire

0

Je veux juste ajouter quelque chose à réponse ci-dessus (je donnerai par exemple). Je vais utiliser encodedQuery, c'est plus sûr que addQuery().

var gr=new GlideRecord('users');//Creating object 
gr.addEncodedQuery("Paste query after creating from query builder"); 
gr.query();//Executing query 
while(gr.next()) 
{ 
    gs.addInfoMessage("User=" + gr.user_name); 
    gs.addInfoMessage("Company Name=" + gr.company.name); 
    gs.addInfoMessage("Company Address=" + gr.company.street); 
    gr.addInfoMessage("Company City=" + gr.company.city); 
}