简体   繁体   中英

Oracle select with sub queries

I have two oracle select queries like

SELECT loc.location AS LOCATION , req.requisition AS REQ 
FROM location_view loc, requisition_view req, association ass 
WHERE loc.name = 'ABC' AND req.name = 'TRANSFER' 
AND ass.entity_id_2 = req.entity_id AND ass.entity_id_1 = loc.entity_id

And the result looks like:

在此处输入图片说明

Other query is like:

 SELECT req.requisition AS req, exp.experiment AS expt 
 FROM experiment_view exp, requisition_view req, association_view ass 
 WHERE expt.name = 'RETRIEVAL'AND req.name = 'TRANSFER' 
 AND ass.entity_id_2 = req.entity_id AND ass.entity_id_1 = expt.entity_id 

Result :

在此处输入图片说明

I am trying to combine these two SELECT queries so I get to see these results:

在此处输入图片说明

Should I be using Sub-Queries to see the combined result or is there any other way of optimizing?

I'm not sure the provided solutions are correct. All of them are using 1 join to the association table. You need 2. Because Association looks to be a generic mapping table so the row that joins locations to requisitions is not the same as the one which joins requisitions to experiments. Maybe i'm wrong but i'd go for :

SELECT
  loc.location as LOCATION , 
  req.requisition as REQ, 
  exp.experiment as EXPT
FROM  location_view    loc
JOIN  association      asslr ON asslr.entity_id_1 = loc.entity_id
JOIN  requisition_view req   ON asslr.entity_id_2 = req.entity_id and req.name = 'TRANSFER'
JOIN  association_view assre ON assre.entity_id_2 = req.entity_id
JOIN  experiment_view  exp   ON assre.entity_id_1 = exp.entity_id AND exp.name = 'RETRIEVAL'
WHERE loc.name = 'ABC' 

The two queries are nearly identical. The results can be joined together on a common element so yes, they can just be written as one query:

select loc.location as LOCATION , req.requisition as REQ, exp.experiment as expt
from location_view loc, requisition_view req, association ass, experiment_view exp
where  loc.name = 'ABC' and req.name = 'TRANSFER' and ass.entity_id_2 = req.entity_id and ass.entity_id_1 = loc.entity_id and ass.entity_id_1 = expt.entity_id and expt.name = 'RETRIEVAL'

This is a bit of an ancient nonstandard way to write queries though; look into how the INNER JOIN keywords work; here's how I'd have laid this query out:

select
  loc.location as LOCATION , 
  req.requisition as REQ, 
  exp.experiment as expt
from 
  association ass
  INNER JOIN
  location_view loc
  ON
    ass.entity_id_1 = loc.entity_id

  INNER JOIN 
  requisition_view req 
  on 
    ass.entity_id_2 = req.entity_id

  INNER JOIN
  experiment_view expt
  ON
    ass.entity_id_1 = expt.entity_id

WHERE        
  loc.name = 'ABC' and
  req.name = 'TRANSFER' and
  expt.name = 'RETRIEVAL'
SELECT loc.location AS location, 
       req.requisition AS req,
       exp.experiment AS expt
  FROM location_view loc
 INNER JOIN association ass
    ON loc.entity_id = ass.entity_id_1
 INNER JOIN requisition_view req
    ON req.entity_id = ass.entity_id_2
 INNER JOIN experiment_view exp
    ON expt.entity_id = ass.entity_id_1
 WHERE loc.name = 'ABC'
   AND req.name = 'TRANSFER' 
   AND expt.name = 'RETRIEVAL'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM