Joining 6 tables into single query?
join, oracle, oracle11g, sql
Solution
Your issue is that Prod_Id 1 is both in and out of those date ranges. So instead, use a subquery to filter out which Prod_Id are in those ranges, and exclude those.
This is a much simplified version of your query:
SELECT P.Prod_ID
FROM Products P
LEFT JOIN (
SELECT Prod_ID
FROM Hires
WHERE hire_end >= To_Date('20130121', 'yyyymmdd') AND hire_start <= To_Date('20130126', 'yyyymmdd')
) H ON P.Prod_ID = H.Prod_ID
WHERE h.prod_id IS NULL
And the SQL Fiddle.
Assuming I copied and pasted correctly, this should be your query:
SELECT products.prod_id, products.title, products.price, product_types.name,
listagg(suppliers.name, ',') WITHIN GROUP(ORDER BY suppliers.name) suppliers
FROM products
INNER JOIN product_suppliers ON products.prod_id = product_suppluer.prod_id
INNER JOIN product_types ON product_types.type_id = products.type_id
INNER JOIN suppliers ON product_suppliers.supp_id = suppliers.supp_id
LEFT JOIN (
SELECT Prod_ID
FROM Hires
WHERE hire_end >= To_Date('20130121', 'yyyymmdd') AND hire_start <= To_Date('20130126', 'yyyymmdd')
) H ON products.Prod_ID = H.Prod_ID
WHERE H.Prod_ID IS NULL
GROUP BY products.prod_id, products.title, products.price, product_types.name
Hope this helps.
Problem
Hey can anyone help me join the 5 tables below into a single query? I currently have the query below but is doesn't seem to work as if there are two products with the same ID inside the hires table all of the products are returned form the products table which is obviously wrong. ``` SELECT products.prod_id, products.title, products.price, product_types.name, listagg(suppliers.name, ',') WITHIN GROUP(ORDER BY suppliers.name) suppliers FROM products INNER JOIN product_suppliers ON products.prod_id = product_suppluer.prod_id INNER JOIN product_types ON product_types.type_id = products.type_id INNER JOIN suppliers ON product_suppliers.supp_id = suppliers.supp_id LEFT OUTER JOIN hires ON hires.prod_id = products.prod_id WHERE (hires.hire_end < to_date('21-JAN-13') OR hires.hire_start > to_date('26-JAN-13')) OR hires.prod_id IS NULL GROUP BY products.prod_id, products.title, products.price, product_types.name ``` Table data: ``` PRODUCTS -------------------------------------------- | Prod_ID | Title | Price | Type_ID | |------------------------------------------| | 1 | A | 5 | 1 | | 2 | B | 7 | 1 | | 3 | C | 3 | 2 | | 4 | D | 3 | 3 | |------------------------------------------| PRODUCT_TYPES ---------------------- | Type_ID | Type | |--------------------| | 1 | TYPE_A | | 2 | TYPE_B | | 3 | TYPE_C | | 4 | TYPE_D | |--------------------| PRODUCT_SUPPLIERS ------------------------- | Prod_ID | Supp_ID | |-----------------------| | 1 | 1 | | 1 | 2 | | 2 | 2 | | 3 | 3 | | 4 | 4 | |-----------------------| SUPPLIERS ---------------------- | Supp_ID | Name | |--------------------| | 1 | SUPP_A | | 2 | SUPP_B | | 3 | SUPP_C | | 4 | SUPP_D | |--------------------| HIRES --------------------------------------------------------------- | Hire_ID | Prod_ID | Cust_ID | Hire_Start | Hire_End | |-----------------------|------------|------------------------| | 1 | 1 | 1 | 22-Jan-13 | 23-Jan-13 | | 2 | 2 | 2 | 27-Jan-13 | 29-Jan-13 | | 3 | 1 | 3 | 30-Jan-13 | 31-Jan-13 | |-----------------------|------------|------------|-----------| PRODUCTS -------------------------------- | Cust_ID | Name | Phone | |------------------------------| | 1 | Cust_A | 555-666 | | 2 | Cust_B | 444-234 | | 3 | Cust_C | 319-234 | | 4 | Cust_D | 398-092 | |------------------------------| ``` The output from the query at the moment looks like this: ``` ------------------------------------------------------------- | Prod_ID | Title | Price | Type_ID | Suppliers | |------------------------------------------|----------------| | 1 | A | 5 | Type_A | SUPP_A,SUPP_B | | 2 | B | 7 | Type_B | SUPP_B | | 3 | C | 3 | Type_C | SUPP_C | | 4 | D | 3 | Type_D | SUPP_D | |------------------------------------------|----------------| ``` When it should look like this surely? as Prod_ID '1' is hired out between the dates in the query ``` ------------------------------------------------------------- | Prod_ID | Title | Price | Type_ID | Suppliers | |------------------------------------------|----------------| | 2 | B | 7 | Type_B | SUPP_B | | 3 | C | 3 | Type_C | SUPP_C | | 4 | D | 3 | Type_D | SUPP_D | |------------------------------------------|----------------| ``` If anyone can help modify the query to output as suggested i would be really grateful. Because my understanding is that it should work as written?