我目前有两张桌子:
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)
但这似乎没有成功。为什么呢?
答案 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
(关系表)。