试图将两个查询合并为一个查询

时间:2018-07-18 14:57:13

标签: sql oracle

我有两个表,如下所示。我想合并并编写一个查询,现在我得到写两个查询的结果。

表1:userProduct

this

Table2:userTable

pid    productName

1     ipad
2     mobile
3     tv
4     laptop
5     desktop
6     tablet

下面是我想作为单个查询编写的两个查询,但是通过编写两个查询得到的结果相同。

id    username     pid
1      tom     1
2      john        1
3      joann       1
4      steve       3
5      ann         4
6      dexter      4
7      ryann       6
8      sam         6

我可以从单个查询中获得不同的产品名称(6行)以及条件为select productname from userProduct; //it returns 6 rows select up.pid as pid,ut.username as name from usertable ut,userproduct up where ut.pid = up.pid; //returns 8 rows 的匹配行(它返回8行)

3 个答案:

答案 0 :(得分:2)

您可以获取每个用户及其拥有的所有产品,基本上就是您正在做的事情,但包括产品名称(并使用ANSI连接语法):

select ut.id, ut.username, ut.pid, up.productname
from userTable ut
join userProduct up on up.pid = ut.pid
order by ut.id, up.pid;

        ID USERNAME        PID PRODUCTNAME 
---------- -------- ---------- ------------
         1 tom               1 ipad        
         2 john              1 ipad        
         3 joann             1 ipad        
         4 steve             3 tv          
         5 ann               4 laptop      
         6 dexter            4 laptop      
         7 ryann             6 tablet      
         8 sam               6 tablet      

或者您可以获得包含该产品所有用户的汇总列表的产品:

select up.pid, up.productname,
  listagg(ut.username, ',') within group (order by ut.id) as usernames
from userProduct up
join userTable ut on ut.pid = up.pid
group by up.pid, up.productname
order by up.pid;

       PID PRODUCTNAME  USERNAMES                     
---------- ------------ ------------------------------
         1 ipad         tom,john,joann                
         3 tv           steve                         
         4 laptop       ann,dexter                    
         6 tablet       ryann,sam      

或将其更改为左外部联接以包含没有用户的产品,这将获得您说要使用的不同产品名称的六行:

select up.pid, up.productname,
  listagg(ut.username, ',') within group (order by ut.id) as usernames
from userProduct up
left join userTable ut on ut.pid = up.pid
group by up.pid, up.productname
order by up.pid;

       PID PRODUCTNAME  USERNAMES                     
---------- ------------ ------------------------------
         1 ipad         tom,john,joann                
         2 mobile                                     
         3 tv           steve                         
         4 laptop       ann,dexter                    
         5 desktop                                    
         6 tablet       ryann,sam                     

或(远离我认为的描述,但仍显示所有产品)删除汇总以查看原始的八行以及没有用户的产品条目:

select up.pid, up.productname, ut.id, ut.username
from userProduct up
left join userTable ut on ut.pid = up.pid
order by up.pid, ut.id;

       PID PRODUCTNAME          ID USERNAME
---------- ------------ ---------- --------
         1 ipad                  1 tom     
         1 ipad                  2 john    
         1 ipad                  3 joann   
         2 mobile                          
         3 tv                    4 steve   
         4 laptop                5 ann     
         4 laptop                6 dexter  
         5 desktop                         
         6 tablet                7 ryann   
         6 tablet                8 sam     

答案 1 :(得分:0)

从外观上,您只需添加另一项即可选择-

select up.pid as pid,ut.username as name, **up.productname** 
from usertable ut,userproduct up where ut.pid = up.pid; 

答案 2 :(得分:0)

你不能,因为输出将根据内部连接匹配行,从这个问题很明显,你想从pid的内部连接获取6行,总的来说,它与pid匹配8行,并且其中没有不匹配的列。