La clausola IN richiede una spiegazione speciale. Le due forme sintattiche sono:
SREL_attr_name.subq_WHERE_attr[.attr] IN ( valore1 [, valore2 [,…]] ) SREL_attr_name.[subq_SELECT_attr]LIST_name.subq_WHERE_attr IN (valore1, [,valore2 [,…]] )
Il lato sinistro della clausola deve iniziare con un attributo SREL-type della tabella sottoposta a query, rappresentato da SREL_attr_name. subq_WHERE_attr è un attributo dell'oggetto esterno che potrebbe essere esso stesso un altro puntatore SREL.
Ad esempio, una query sull'oggetto Richiesta ('cr') può essere codificato nel modo seguente:
category.sym IN ('Soft%', 'Email')
Questo si traduce nell'istruzione SQL seguente:
SELECT … FROM cr WHERE cr.category IN (SELECT persistent_id FROM pcat WHERE sym LIKE 'Soft%' OR sym = 'Email')
Nella query secondaria precedente, 'pcat' rappresenta il nome dell'oggetto a cui punta cr.category.
Il secondo formato della clausola IN può eseguire ricerche negli elenchi BREL. Ad esempio, per trovare tutte le richieste assegnate a un analista in un gruppo specifico, la clausola è la seguente:
assignee.[member]group_list.group IN (U'913B485771E1B347968E530276916387')
La prima parte della clausola, assignee, è uno SREL (chiave esterna) dell'oggetto cr, che punta all'oggetto cnt. La parte centrale, group_list, che rappresenta un attributo dell'oggetto cnt, è un elenco di oggetti cnt che rappresenta i gruppi a cui appartiene un contatto. L'ultima parte, group, forma la prima parte della clausola where per la query secondaria IN. 'U'913B485771E1B347968E530276916387 è il valore della chiave esterna da associare al gruppo. Il valore restituito dalla query secondaria è specificato da [member]. Questo si traduce nell'istruzione SQL seguente:
SELECT … FROM cr WHERE cr.assignee IN (SELECT member from grpmem WHERE group = U'913B485771E1B347968E530276916387')
È possibile specificare più chiavi esterne da associare a più oggetti, utilizzando un elenco separato da virgole:
assignee.[member]group_list.group IN (U'913B485771E1B347968E530276916387', U'913B485771E1B347968E530276916300')
In questo caso specifico di utilizzo della clausola IN non è possibile avvalersi della notazione a punti; ad esempio, la query seguente non è valida:
assignee.[member]group_list.group.last_name IN ('Account Center')
Uno degli utilizzi della clausola IN è evitare i prodotti cartesiani. Ad esempio, la query seguente genera un prodotto cartesiano estremamente inefficiente:
assignee.last_name LIKE 'MIS%' OR group.last_name LIKE 'MIS%'
Utilizzando la clausola IN, la query può essere codificata nel modo seguente:
assignee.last_name IN 'MIS%' OR group.last_name IN 'MIS%'
Questa query non crea un prodotto cartesiano; non crea infatti nessuna unione.
Nota: le parentesi che in genere racchiudono l'elenco dei valori nella parte destra della clausola IN possono essere omesse se nell'elenco è presente un solo valore. Analogamente, è possibile evitare le unioni eseguendo la conversione delle query, come mostrato nell'esempio seguente:
assignee.last_name LIKE 'Smith'
a:
assignee = U'913B485771E1B347968E530276916387'
Questo impedisce l'unione ma rende la partizione meno chiara. Con la clausola IN, la stessa partizione può essere scritta nel modo seguente, mantenendo la chiarezza della prima versione e quasi la stessa efficienza della seconda versione:
assignee.last_name IN 'Smith'
La parola chiave 'NOT' non può essere utilizzata insieme alla clausola IN, ad esempio "NOT IN".
| Copyright © 2012 CA. Tutti i diritti riservati. | Contatta CA Technologies |