Oracle从单个表中选择多个

时间:2018-06-03 15:05:51

标签: sql oracle left-join

我有这个问题:

SELECT a.SELECTEDID contentId,  
       a.SELECTED_COUNT selectedCount, 
       a.P_ID 
from ( 
   SELECT t1.SELECTEDID, 
          ROUND(SUM(t1.SELECTED_COUNT*(2/3))) SELECTED_COUNT  ,
          t1.P_ID 
   FROM A_SEARCH t1 
   WHERE t1.P_ID = '11' 
   and t1.PERIOD >= ADD_MONTHS(TO_DATE('05/01/2018 12:00 AM', 'MM/DD/YYYY HH12:MI AM'), -3) 
   AND t1.PERIOD < TO_DATE('05/01/2018 12:00 AM', 'MM/DD/YYYY HH12:MI AM')  
   GROUP BY t1.P_ID, t1.SELECTEDID          
 ) a 
 LEFT JOIN 
 (
   SELECT t2.SELECTEDID,  
          ROUND(SUM(t2.SELECTED_COUNT*2)) SELECTED_COUNT ,
          t2.P_ID 
   FROM A_SEARCH t2 
   WHERE t2.P_ID ='11' 
   and t2.PERIOD >= TO_DATE('05/01/2018 12:00 AM', 'MM/DD/YYYY HH12:MI AM')  
   GROUP BY t2.P_ID, t2.SELECTEDID  
 ) b
 on b.P_ID = a.P_ID
 ORDER BY a.SELECTED_COUNT desc;

表格:

 P_ID(VARCHAR2),
 P_VALUE(VARCHAR2), 
 SELECTEDID(VARCHAR2), 
 SELECTED_COUNT(NUMBER),
 PERIOD(TIMESTAMP)

始终选择此行

 11,    bb,test22,  2,  01-APR-18 12.00.00.000000000 AM

此行从未选择

 11,    aa, test,   2,  01-JUN-18 12.00.00.000000000 AM

我尝试从单个表中进行多个选择,然后按结果排序。  但不知何故,只有查询中的第一个选择是successfuk,并且选择了上面的第一行  但是第二次LEFT JOIN并没有赶上第二排,我看不出有什么问题。
如何选择两行?

2 个答案:

答案 0 :(得分:2)

您只是从a中选择列作为最终输出:

SELECT a.SELECTEDID contentId,  a.SELECTED_COUNT selectedCount, a.P_ID

如果b中的行与加入条件匹配,您还需要从b中选择列才能显示它们。它们将显示在与a中匹配行的列相同的行上。

你说

  

我尝试从单个表中进行多个选择,然后按顺序排序   结果

这意味着您希望为ab子查询的结果获取单独的输出行,这意味着您并不真正想要加入。

您可能需要两个子查询中的UNION

答案 1 :(得分:0)

据我所知,您的查询相当于:

SELECT t1.SELECTEDID, ROUND(SUM(t1.SELECTED_COUNT*(2/3))) as SELECTED_COUNT, t1.P_ID 
FROM A_SEARCH t1 
WHERE t1.P_ID = 11 AND  -- I removed the single quotes, assuming the column is a number
      t1.PERIOD >= ADD_MONTHS(DATE '2018-05-01', -3) AND
      t1.PERIOD < DATE '2018-05-01'
GROUP BY t1.P_ID, t1.SELECTEDID  ;   

LEFT JOIN可能会乘以行数;我不认为这是可取的。

另请注意使用date关键字简化date文字。