multi-table queries (join) 2 tables
DESCRIPTION
Multi-table queries (JOIN) 2 tables. Retrieve the part name for all parts shipped in quantities equal to 200. SELECT DISTINCT PART.PartName FROM PART, SHIPMENT WHERE PART.PartNumber = SHIPMENT.PartNumber AND SHIPMENT.quantity = 200;. Conjunct #1 is a PK FK comparison. - PowerPoint PPT PresentationTRANSCRIPT
Retrieve the part name for all parts shipped in quantities equal to 200SELECT DISTINCT PART.PartNameFROM PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SHIPMENT.quantity = 200;
SELECT DISTINCT PART.PartNameFROM PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SHIPMENT.quantity = 200;
So how does this work?
Conjunct #1 is a PK FK comparison
Conjunct #2 qualifies retrieval
SELECT DISTINCT PART.PartNameFROM PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SHIPMENT.quantity = 200;
Conceptually, we can understand the execution of the query in terms of row scans.
A Scan is a sequential inspection of many rows for the purpose of returning rows that meet a criteria.
The following demonstrations are a simplified version of the Nested Loop technique (as opposed to “merge sort” and “hashed join”)
SELECT DISTINCT PART.PartNameFROM PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SHIPMENT.quantity = 200;
PK/FK comparison requires one scan of the FK set for each PK in the parent table.Row is included in the view where PK=FK and Qty = 200
SELECT DISTINCT PART.PartNameFROM PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SHIPMENT.quantity = 200;
(Scan 1)
.
.
.(FK Scan)
(No Matches: TT)
(P1=P1 300=200)(P1=P2 200=200)
(P1=P5 100=200)
SELECT DISTINCT PART.PartNameFROM PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SHIPMENT.quantity = 200;
(Scan 2)
.
.
.(FK Scan)
(Two Matches: TT)
(P2=P1 300=200)(P2=P2 200=200)
(P2=P5 100=200)
This removes duplicates in results
SELECT DISTINCT PART.PartNameFROM PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SHIPMENT.quantity = 200;
(Scan 3)
.
.
.(FK Scan)
( No Matches: TT)
(P3=P1 300=200)(P3=P2 200=200)
(P3=P5 100=200)
SELECT DISTINCT PART.PartNameFROM PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SHIPMENT.quantity = 200;
(Scan 4)
.
.
.(FK Scan)
( Two Matches: TT)
(P4=P1 300=200)(P4=P2 200=200)
(P4=P5 100=200)
(And So On...)
SELECT DISTINCT PART.PartNameFROM PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SHIPMENT.quantity = 200;
(Scan 6)
How many row comparisons?rows(PK-table) X rows(FK-table)6 X 12 = 72
Three common methods used by DBMS optimizers to evaluate Joins◦ Nested Loop◦ Merge Scan◦ Hash Join
Nested Loop◦ Essentially the preceding demo◦ One table defined as external and one table
defined as internal (External:Internal) (1:M) (Parent:Child)
◦ If there isn’t an index on the FK, the internal table has to be opened for a scan for every row of the external table
Retrieve supplier name and part name for parts shipped in quantities less than 400.SELECT DISTINCT SUPPLIER.SupplierName, PART.PartNameFROM SUPPLIER, PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SUPPLIER.SupplierNumber = SHIPMENT.SupplierNumber AND SHIPMENT.Quantity < 400;
SELECT DISTINCT SUPPLIER.SupplierName, PART.PartNameFROM SUPPLIER, PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SUPPLIER.SupplierNumber = SHIPMENT.SupplierNumber AND SHIPMENT.Quantity < 400; (Scan 1)
(One Match: TT T)
.
.
.(FK Scan)
(P1=P1 S1=S1 400>300)(P1=P2 S1=S1 400>200)
(P1=P5 S1=S4 400>100)
SELECT DISTINCT SUPPLIER.SupplierName, PART.PartNameFROM SUPPLIER, PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SUPPLIER.SupplierNumber = SHIPMENT.SupplierNumber AND SHIPMENT.Quantity < 400; (Scan 2)
(No Matches: TT T)
.
.
.(FK Scan)
(P1=P1 S2=S1 400>300)(P1=P2 S2=S1 400>200)
(P1=P5 S2=S4 400>100)
SELECT DISTINCT SUPPLIER.SupplierName, PART.PartNameFROM SUPPLIER, PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SUPPLIER.SupplierNumber = SHIPMENT.SupplierNumber AND SHIPMENT.Quantity < 400; (Scan 2-5)
(No Matches: TT T)
.
.
.
So we finish out the “P1” Supplier scan with no matches
SELECT DISTINCT SUPPLIER.SupplierName, PART.PartNameFROM SUPPLIER, PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SUPPLIER.SupplierNumber = SHIPMENT.SupplierNumber AND SHIPMENT.Quantity < 400; (Scan 6)
(One Match: TT T)
.
.
.(FK Scan)
(P2=P1 S1=S1 400>300)(P2=P2 S1=S1 400>200)
(P2=P5 S1=S4 400>100)
SELECT DISTINCT SUPPLIER.SupplierName, PART.PartNameFROM SUPPLIER, PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SUPPLIER.SupplierNumber = SHIPMENT.SupplierNumber AND SHIPMENT.Quantity < 400; (Scan 7)
(One Match: TT T)
.
.
.(FK Scan)
(P2=P1 S2=S1 400>300)(P2=P2 S2=S1 400>200)
(P1=P5 S2=S4 400>100)
SELECT DISTINCT SUPPLIER.SupplierName, PART.PartNameFROM SUPPLIER, PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SUPPLIER.SupplierNumber = SHIPMENT.SupplierNumber AND SHIPMENT.Quantity < 400; (Scan 8)
(One Match: TT T)
.
.
.(FK Scan)
(P2=P1 S3=S1 400>300)(P2=P2 S3=S1 400>200)
(P1=P5 S3=S4 400>100)
(And so on...)
SELECT DISTINCT SUPPLIER.SupplierName, PART.PartNameFROM SUPPLIER, PART, SHIPMENTWHERE PART.PartNumber = SHIPMENT.PartNumber AND SUPPLIER.SupplierNumber = SHIPMENT.SupplierNumber AND SHIPMENT.Quantity < 400;
How many row comparisons?6x5x12 = 360
Retrieve the supplier name and part name for all shipments with quantity greater than or equal to 200 for which the warehouse is located in the same city as the supplierSELECT DISTINCT SUPPLIER.SupplierName, PART.PartNameFROM SUPPLIER, PART, SHIPMENTWHERE (PART.PartNumber = SHIPMENT.PartNumber AND SUPPLIER.SupplierNumber = SHIPMENT.SupplierNumber) AND (SHIPMENT.Quantity >= 200 AND SUPPLIER.SupplierCity = PART.PartCity);
For each row in the outer table (Parent), every row in the inner table (Child) is scanned for a PK/FK match and any qualifying predicate.In your WHERE clause, you must have a PK=FK statement for every Parent/Child relationship involved in the query.
(PK=FK Scan)
Data
Data
Data
Data
Data
FK Value
FK Value
FK Value
FK Value
FK Value
PK Value
PK Value
PK Value
Data
Data
Data
(Outer Table) (Inner Table)
OuterTable
InnerTable