如何使用子查询查询Oracle表

时间:2014-11-01 19:35:52

标签: sql oracle

我正在尝试编写一个查询,其中一个表中的列从另一列返回数据。我曾尝试使用子查询但没有运气。我宁愿找到一个使用子查询的解决方案,而不是使用' JOIN'因为我还是sql / oracle的新手,可以更好地理解子查询...

第一个查询是:

SELECT MA_gardenermanager.managerID "senior gardener"
, MA_gardeners.gardenername
, MA_gardenermanager.gardenerID "Manages"
FROM MA_gardenermanager, MA_gardeners
where MA_gardeners.gardenerID = MA_gardenermanager.managerID
order by MA_gardenermanager.managerID
, MA_gardenermanager.gardenerID
;

这将返回以下数据:

senior gardener GARDENERNAME      Manages
4               Olivia Brown      1
4               Olivia Brown      5
5               Emily Williams    2
5               Emily Williams    3

第二个查询是:

select MA_gardenermanager.gardenerID
, MA_gardeners.gardenername "Manages"
from MA_gardeners, MA_gardenermanager
where MA_gardeners.gardenerID = MA_gardenermanager.gardenerID
;

这将返回以下数据:

GARDENERID  Manages
1           Oliver Smith
2           Jack Jones
3           Harry Taylor
5           Emily Williams

我正在尝试将上面的两个查询结合起来产生这个:

senior gardener GARDENERNAME      Manages
4               Olivia Brown      Oliver Smith
4               Olivia Brown      Emily Williams
5               Emily Williams    Jack Jones
5               Emily Williams    Harry Taylor

我已经尝试了这个但是继续获得ORA-01427:单行子查询返回多行:

SELECT MA_gardenermanager.managerID "senior gardener"
, MA_gardeners.gardenername
, MA_gardenermanager.gardenerID "manages"
, (select MA_gardeners.gardenername
from MA_gardeners, MA_gardenermanager
where MA_gardeners.gardenerID = MA_gardenermanager.gardenerID)
FROM MA_gardenermanager, MA_gardeners
where MA_gardeners.gardenerID = MA_gardenermanager.managerID
;

有没有一种简单的方法可以将第二个查询作为子查询插入第一个查询来组合这两个查询?

2 个答案:

答案 0 :(得分:0)

因为您的内部查询返回超过1行

试试这样: 另一种方式

select L.senior_gardener,L.GARDENERNAME,R.Manages from 
(SELECT MA_gardenermanager.managerID "senior gardener"
, MA_gardeners.gardenername
, MA_gardenermanager.gardenerID "Manages"
FROM MA_gardenermanager, MA_gardeners
where MA_gardeners.gardenerID = MA_gardenermanager.managerID
order by MA_gardenermanager.managerID
, MA_gardenermanager.gardenerID
) L
left join (select MA_gardenermanager.gardenerID
, MA_gardeners.gardenername "Manages"
from MA_gardeners, MA_gardenermanager
where MA_gardeners.gardenerID = MA_gardenermanager.gardenerID)R
on L.Manages=R.GARDENERID

答案 1 :(得分:0)

  

"我宁愿找到使用子查询而不是使用子查询的解决方案   ' JOIN'因为我还是sql / oracle的新手,可以更好地理解   子查询..."

Fnord。子查询仅仅使实际上非常简单的事情复杂化。您所需要做的就是在FROM子句中引用MA_gardeners表两次。使用别名来区分查询其余部分中的实例:

SELECT gm.managerID "senior gardener"
       , mgr.gardenername
       , gar.gardenername "Manages"
FROM MA_gardenermanager gm
     , MA_gardeners mgr
     , MA_gardeners gar
where mgr.gardenerID = gm.managerID 
and gar.gardenerID = gm.gardenerID
order by gm.managerID
       , gm.gardenerID