我正在尝试在Oracle-sql中练习子查询,我很难理解它的概念。
在我的下面的代码中,我试图将一个名为item_loc的表嵌套到另一个名为store_item的表中,下面的代码不能编译。我得到一个错误
ORA-00933: SQL command not properly ended 00933. 00000 - "SQL command not properly ended"
我不知道该怎么做才能解决它?
SELECT sub.store
FROM store_item sub
(SELECT item_id
FROM item_loc
WHERE item_id = 1134373
)sub
WHERE sub.store = 1
;
但是,当我运行上面的代码但修改它时,它会运行。但我觉得好像我运行下面的代码我不需要嵌套任何东西。我只是想了解嵌套是如何工作的。
SELECT sub.*
FROM
(SELECT item_id
FROM item_loc
WHERE item_id = 1134373
)sub
;
问题是:你使用别名sub
两次。也许是这样的:
SELECT sub.store
FROM store_item sub2
WHERE item_id in
(SELECT item_id
FROM item_loc
WHERE item_id = 1134373
)
AND sub2.store = 1;
要么
SELECT sub.store
FROM store_item sub2 join
(SELECT item_id
FROM item_loc
WHERE item_id = 1134373
) sub ON sub.item_id = sub2.item_id -- i assume join condition
WHERE sub2.store = 1;
即你应该以两种不同的方式比较两组。
您的陈述至少包含两个错误。首先,它的FROM子句包含两个具有相同名称“sub”的不同引用。接下来,它们之间应该是逗号或连接子句。为了正确,它应该是这样的
SELECT sub1.store
FROM store_item sub1 join
(SELECT item_id
FROM item_loc
WHERE item_id = 1134373
) sub2 on <<<some condition>>>
WHERE sub1.store = 1
;
而且,目前还不清楚你想做什么。你想使用嵌套表吗?或者查询子查询?或者是其他东西?
无论如何,很难在非常人为的例子上学到一些东西。尝试找到可以使用这种技术的真正问题,它更容易。
子查询类似于表。
表是一组行。视图是一组行。 select语句的结果是一组行。他们都有相同的“权利和责任”。任何行集都可以用作select
语句中的数据源。
你可以写:
select <columns list> from mytable
mytable
这是一张桌子。接下来,您可以将此语句视为表并编写以下内容:
select <something else>
-- you replace here a name of a table with the query (which is a subquery)
from (select <columns list> from mytable)
您可以为表/视图/子查询提供别名:
select <columns list> from mytable t;
select <something else>
from (select <columns list> from mytable) subquery
这里t
和subquery
是别名。
接下来,加入。你可以加入任何这个(表/视图/子查询)与任何:
select ...
from mytable t,
(...) subquery
where t.column1 = subquery.column2
要么
select ...
from mytable t join (...) subquery
on t.column1 = subquery.column2
现在,我认为很明显,您的查询有什么问题。