Oracle 在多个查询PL/SQL中从一个表或另一个表中选择数据

Oracle 在多个查询PL/SQL中从一个表或另一个表中选择数据,oracle,plsql,Oracle,Plsql,问我问题的最简单方法是假设情景 假设我们有3张桌子。新加坡的价格、产品价值和老板不合理的要求 所以价格是一个非常简单的表格。包含名称的Item列和包含数字的Price列 product_Val也是一个简单的2列表。输入列,其中包含水果或蔬菜的类型,然后将列命名为番茄、菠萝等 boss\u\u requires只包含一列Fruit,它可以包含一些Fruit的名称 好吗?嗯 所以,我的老板要我写一个查询,返回他不合理需求表中每种水果的价格。很简单。但是,如果他的表中没有任何条目,他只想让我输出农产品

问我问题的最简单方法是假设情景

假设我们有3张桌子。新加坡的价格、产品价值和老板不合理的要求

所以价格是一个非常简单的表格。包含名称的Item列和包含数字的Price列

product_Val也是一个简单的2列表。输入列,其中包含水果或蔬菜的类型,然后将列命名为番茄、菠萝等

boss\u\u requires只包含一列Fruit,它可以包含一些Fruit的名称

好吗?嗯

所以,我的老板要我写一个查询,返回他不合理需求表中每种水果的价格。很简单。但是,如果他的表中没有任何条目,他只想让我输出农产品价值中所有水果的价格

现在,假设我不知道设计这个愚蠢的假设系统的DBA住在哪里,因此无法让他解决这个问题,我们的查询如下:

if <Logic to determine if Bosses demands are empty>
Then
select Item, Price
from Singapore_Prices
where Item in (select Fruit from Bosses_Unreasonable_demands)
Else
select Item, Price
from Singapore_Prices
where Item in (select Name from Produce_val where type = 'Fruit')
end if;
好吧,我们会把它们选进一个变量,然后输出变量,可能是批量收集的恶作剧,但这并不重要

这很有效。它完全是功能性的,不会太慢,即使我们把它扩展到新加坡以外的2000家其他商店。好吧,不比其他任何涉及2000个表的操作慢,但是,我仍然在做两个不同的select语句,它们实际上是相同的。每当我的手指按ctrl-V键时,我的Comp Sci老师就会在他们的坟墓里翻滚。我可以将这段代码一分为二,只执行一个select语句。我知道我可以

我只是不知道该怎么做。我不能将游标用作in语句,我不能使用嵌套表或varray,我不能使用精心编制的字符串,我。。。我只是。。。我不知道。我不知道怎么做。有办法吗?它存在吗


还是必须永远复制/粘贴?

我认为可以使用嵌套表。假设您有一个使用CREATE type定义的架构级嵌套表类型FROUT\u NAME\u LIST


或者,如果您更愿意,选择表格中的列值将我的水果名称列表作为水果名称列表,您最好选择动态SQL,因为您无法参数化表格或列名

您将有一个SQL查询模板,有一个逻辑来确定要查询的表和列,然后将它们混合在一起并执行

另一种方法,仍然有很多类似ctrl-v的代码是使用set-construction UNION ALL:

select 1st query where boss_condition
union all
select 2nd query where not boss_condition
试试这个:

SELECT *
  FROM (SELECT s.*, 'BOSS' AS FRUIT_SOURCE
          FROM BOSSES_UNREASONABLE_DEMANDS b
          INNER JOIN SINGAPORE_FRUIT_LIST s
            ON s.ITEM = b.FRUIT
          CROSS JOIN (SELECT COUNT(*) AS BOSS_COUNT
                        FROM BOSSES_UNREASONABLE_DEMANDS)) x
  UNION ALL
       (SELECT s.*, 'NORMAL' AS FRUIT_SOURCE
          FROM PRODUCE_VAL p
          INNER JOIN SINGAPORE_FRUIT_LIST s
            ON (s.ITEM = p.NAME AND
                s.TYPE = 'Fruit')
          CROSS JOIN (SELECT COUNT(*) AS BOSS_COUNT
                        FROM BOSSES_UNREASONABLE_DEMANDS)) n
  WHERE (BOSS_COUNT > 0 AND FRUIT_SOURCE = 'BOSS') OR
        (BOSS_COUNT = 0 AND FRUIT_SOURCE = 'NORMAL')

分享和享受。

这些听起来正是我想要的,所以我给了他们一个机会。第一个解决方案提供了SQL语句中不允许的本地集合类型错误第二个是无效的数据类型错误。所谓嵌套表类型,我指的是架构级别的类型,使用CREATE Type定义,而不是PL/SQL块中声明的类型。听起来像是你做了后者。我将编辑,以澄清我希望。
SELECT *
  FROM (SELECT s.*, 'BOSS' AS FRUIT_SOURCE
          FROM BOSSES_UNREASONABLE_DEMANDS b
          INNER JOIN SINGAPORE_FRUIT_LIST s
            ON s.ITEM = b.FRUIT
          CROSS JOIN (SELECT COUNT(*) AS BOSS_COUNT
                        FROM BOSSES_UNREASONABLE_DEMANDS)) x
  UNION ALL
       (SELECT s.*, 'NORMAL' AS FRUIT_SOURCE
          FROM PRODUCE_VAL p
          INNER JOIN SINGAPORE_FRUIT_LIST s
            ON (s.ITEM = p.NAME AND
                s.TYPE = 'Fruit')
          CROSS JOIN (SELECT COUNT(*) AS BOSS_COUNT
                        FROM BOSSES_UNREASONABLE_DEMANDS)) n
  WHERE (BOSS_COUNT > 0 AND FRUIT_SOURCE = 'BOSS') OR
        (BOSS_COUNT = 0 AND FRUIT_SOURCE = 'NORMAL')