Multitable Joins with Correlated Queries

One important rule to remember is never to combine the new syntax with the old one within a single query. First, such syntax may not work properly, and also it would definitely look confusing.

However, if you need to create a correlated query, the SQL99 syntax simply will not work, so the general recommendation is to either use the old syntax or replace correlated query with something else.

The following statement uses a correlated query to retrieve all customer names and phone numbers for customers who have orders:

SELECT   DISTINCT c.cust_name_s,           p.phone_phonenum_s FROM     customer c,          phone p WHERE    c.cust_id_n = p.phone_custid_fn AND EXISTS (SELECT *             FROM order_header oh             WHERE oh.ordhdr_custid_fn = c.cust_id_n) AND      p.phone_type_s = 'PHONE'     CUST_NAME_S                PHONE_PHONENUM_S -------------------------- ---------------- WILE BESS COMPANY          (541) 555-8979 WILE ELECTROMATIC INC.     (541) 555-3246 WILE ELECTROMUSICAL INC.   (503) 555-0502 WILE ELECTRONICS INC.      (609) 555-4091 WILE SEAL CORP.            (909) 555-9957       5 record(s) selected.

The equivalent query that does not involve correlated queries is

SELECT  DISTINCT c.cust_name_s,           p.phone_phonenum_s  FROM     customer c     JOIN           order_header oh     ON    c.cust_id_n = oh.ordhdr_custid_fn     JOIN           phone p     ON    c.cust_id_n = p.phone_custid_fn WHERE    p.phone_type_s = 'PHONE'

As you can see, it is usually possible to avoid correlated queries in a SELECT statement; UPDATE and DELETE statements could be trickier, especially in Oracle and DB2. (MS SQL has a special FROM clause in UPDATE and DELETE statements as described in Chapter 6.)




SQL Bible
Microsoft SQL Server 2008 Bible
ISBN: 0470257040
EAN: 2147483647
Year: 2005
Pages: 208

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net