One of the most frequently used nested query comparison tests determines if a value retrieved by a query is IN (or NOT IN) the set of data values retrieved by a lower level subselect. The following sample query retrieves the names of suppliers who carry part number "P2":
SELECT sname FROM supplier WHERE sno IN SELECT sno FROM partsupp WHERE pno = "P2"
The inner (or lower) query is referred to as a nested query (or subselect) since it is located within an outer query statement. To execute the nested query, the system first tests for the PNO (part number) column values of records located in the PARTSUPP table that match "P2". The subselect statement (or subselect) next retrieves SNO (supplier number) column values for the records containing the correct part number.
The results of this first nested subselect appear below:
sno |
---|
S1 |
S2 |
S3 |
S4 |
The final result (shown below) is then produced by the outer query, which retrieves the four SNAME column values from the SUPPLIER table corresponding to the supplier numbers retrieved in the inner query.
sname |
---|
SMITH |
JONES |
BLAKE |
CLARK |
Note that the last nested query could have been written as a table join, as follows:
SELECT sname FROM supplier, partsupp WHERE supplier.sno = partsupp.sno AND partsupp.pno = "P2"
The processing that occurs for a table join is very similar to that occurring during a nested query execution. This processing consists of selecting a subset of records from one of the tables that meet all conditions except the join condition. The records in the other table are then tested for the join condition against the first subset of records.
The major difference between processing a join and a nested query is that the XDB Server can perform query optimization when a join is executed. For example, query optimization allows the system to decide which table to process first to achieve the most efficient performance. When a nested query is executed, however, the innermost query is always performed first.
Algorithms exist for transforming nested queries into joins (or flat queries) before processing. However, these algorithms are complex and time consuming, and therefore have not been implemented by XDB Server.
When nesting queries, the boolean operator NOT can be included to select those records that do not meet the test conditions set forth in selection criteria. For example, the following query returns the SNO and SNAME column values for all suppliers not found in the PARTSUPP table:
SELECT sno, sname FROM supplier WHERE sno NOT IN SELECT sno FROM partsupp
Supplier S5 (or "ADAMS") is the only supplier that meets this condition.
Parentheses can be added to complex SQL statements to enhance clarity or to change the execution order of the various subqueries and table joins. For example, the following statement performs a series of XDB Server operations equivalent to the descriptive text summary below:
Find all parts carried by suppliers, where the suppliers either have a status of 10 or are located in "PARIS".
SELECT DISTINCT pno, pname FROM part, partsupp WHERE part.pno = partsupp.pno AND sno IN SELECT sno FROM supplier WHERE status = 10 OR city = "PARIS"
This last query retrieves the following results:
pno | pname |
---|---|
P1 | NUT |
P2 | BOLT |
If parentheses are added to the previous complex query, the results are interpreted differently.
The following reformatted query statement is equivalent to the descriptive text summary below:
Find all parts carried by suppliers having a status of 10 or a part made in "PARIS".
SELECT DISTINCT pno, pname FROM part, partsupp WHERE part.pno = partsupp.pno AND sno IN (SELECT sno FROM supplier WHERE status = 10) OR city = "PARIS"
This modified query yields the following result:
pno | pname |
---|---|
P1 | NUT |
P2 | BOLT |
P3 | CAM |
P5 | CAM |