我有两个表,如下所示。我想合并并编写一个查询,现在我得到写两个查询的结果。
表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行)
答案 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行,并且其中没有不匹配的列。