在SQL中使用子查询

时间:2010-11-24 04:11:50

标签: sql database oracle

我目前有两张桌子:

Table Animal:
animal_id, animal_name owner

Table Owners
owner_id owner_name

列出所有动物及其各自所有者的一种方法是使用sql连接:

select animal_id, owner_name
from Animals, Owners
where (owner = owner_id);

我现在想知道如何对子查询执行相同的操作。我想像

select animal_id, owner_name
from Animals
where owner_name = (select owner_name from Owners where owner = owner_id)

但这似乎没有成功。为什么呢?

4 个答案:

答案 0 :(得分:2)

如果您希望结果中包含owner_name字段,并且该字段位于表Owners中,那么您必须以某种方式将所有者加入查询。作为结果集的一部分,您唯一可以返回的是来自包含的表,常量或派生值的列(使用Oracle语言函数对列和/或常量值进行操作)。

编辑:

实际上,现在我考虑一下,你可以使用(或者说,尝试 - 我不是Oracle用户)这种性能极差的语法:

 SELECT animal_id, (SELECT owner_name FROM Owners WHERE owner = Animals.owner_id)
   FROM Animals

就技术而言,这是一种子查询解决方案。

答案 1 :(得分:1)

它不起作用,因为您的from子句中的表中不存在列'owner_name'。要在select中包含子查询结果,请在select子句中包含子查询:

select animal_id, (select owner_name from Owners where owner = owner_id)
from Animals

答案 2 :(得分:0)

您使用的内容就像隐含的笛卡尔联接。

select animal_id, owner_name
from Animals, Owners
where (owner = owner_id);

另一种选择是内连接

select animal_id, owner_name
from Animals A inner join Owners O
     on A.owner = O.owner_id;

您似乎不喜欢SELECT子句中的子查询。我也没有。使用实际的单词'JOIN'可以做类似的事情,但这通常被认为是最好的。

答案 3 :(得分:0)

我认为你可能有一个设计缺陷:owner似乎不是动物的属性。

相反,所有权可能是动物与人(或所有者的任何实体)之间的关系。因此,你应该考虑有三个表,例如Animals(实体表),People(或任何实体表)和Ownership(关系表)。