11.05.2013 Views

La Cara Oculta de Delphi 6

La Cara Oculta de Delphi 6

La Cara Oculta de Delphi 6

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Consultas y modificaciones 217<br />

A este tipo <strong>de</strong> subconsulta que <strong>de</strong>be retornar un solo valor se le <strong>de</strong>nomina selección<br />

única, en inglés, singleton select. <strong>La</strong>s selecciones únicas también pue<strong>de</strong>n utilizarse con<br />

otros operadores <strong>de</strong> comparación, a<strong>de</strong>más <strong>de</strong> la igualdad. Así por ejemplo, la siguiente<br />

consulta retorna información sobre los empleados contratados <strong>de</strong>spués <strong>de</strong><br />

Pedro Pérez:<br />

select *<br />

from Employee E1<br />

where E1.HireDate > (<br />

select E2.HireDate<br />

from Employee E2<br />

where E2.FirstName = 'Pedro' and<br />

E2.<strong>La</strong>stName = 'Pérez')<br />

Si está preguntándose acerca <strong>de</strong> la posibilidad <strong>de</strong> cambiar el or<strong>de</strong>n <strong>de</strong> los operandos,<br />

ni lo sueñe. <strong>La</strong> sintaxis <strong>de</strong> SQL es muy rígida, y no permite este tipo <strong>de</strong> virtuosismos.<br />

Subconsultas: los operadores in y exists<br />

En el ejemplo anterior garantizábamos la singularidad <strong>de</strong> la subconsulta gracias a la<br />

cláusula where, que especificaba una búsqueda sobre una clave única. Sin embargo,<br />

también se pue<strong>de</strong>n aprovechar las situaciones en que una subconsulta <strong>de</strong>vuelve un<br />

conjunto <strong>de</strong> valores. En este caso, el operador a utilizar cambia. Por ejemplo, si queremos<br />

los pedidos correspondientes a las compañías en cuyo nombre figura la palabra<br />

Ocean, po<strong>de</strong>mos utilizar la instrucción:<br />

select *<br />

from Or<strong>de</strong>rs<br />

where Or<strong>de</strong>rs.CustNo in (<br />

select Customer.CustNo<br />

from Customer<br />

where upper(Customer.Company) like '%OCEAN%')<br />

El nuevo operador es el operador in, y la expresión es verda<strong>de</strong>ra si el operando izquierdo<br />

se encuentra en la lista <strong>de</strong> valores retornada por la subconsulta. Esta consulta<br />

pue<strong>de</strong> <strong>de</strong>scomponerse en dos fases. Durante la primera fase se evalúa el segundo<br />

select:<br />

select Customer.CustNo<br />

from Customer<br />

where upper(Customer.Company) like '%OCEAN%'<br />

El resultado <strong>de</strong> esta consulta consiste en una serie <strong>de</strong> códigos: aquellos que correspon<strong>de</strong>n<br />

a las compañías con Ocean en su nombre. Supongamos que estos códigos<br />

sean 1510 (Ocean Paradise) y 5515 (Ocean Adventures). Entonces pue<strong>de</strong> ejecutarse<br />

la segunda fase <strong>de</strong> la consulta, con la siguiente instrucción, equivalente a la original:<br />

select *<br />

from Or<strong>de</strong>rs<br />

where Or<strong>de</strong>rs.Or<strong>de</strong>rNo in (1510, 5515)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!