【问题标题】:Oracle SQL Developer - error when referencing fields within nested from statementsOracle SQL Developer - 引用嵌套 from 语句中的字段时出错
【发布时间】:2021-11-12 15:26:58
【问题描述】:

对于以下查询,当引用“y”中的变量时,第 4 行出现错误。当我只使用“y.*”(第 5 行)时,查询成功运行,但是当我尝试从第 4 行中的指定字段(y.field1 作为 PRODUCT,y.field2 作为 PRODUCT_TYPE,y .entity,y.TYPE1)。对于输出,我希望首先列出这些字段以供视觉参考。

我有这种方法/逻辑适用于其他查询(因为我正在将此逻辑用于查询的多种变体和各种表)。但是,我认为这个问题在于我试图从我的联接语句中的表中引用字段。

(
select 
       -- categorization fields: 
       -- table2.field1 as PRODUCT, table2.field2 as PRODUCT_TYPE, table3.entity, table3.TYPE1
       y.field1 as PRODUCT,
       y.field2 as PRODUCT_TYPE,
       y.entity,
       y.TYPE1
       ,y.*
from   (
  select *
  from   (
    -- table references:
    select table1.*,
           row_number() over (
             partition by
             -- categorization fields: 
             table2.field1,
             table2.field2,
             table3.entity,
             table3.TYPE1 
             order by table3.entity
           ) as rn
    -- table references
    from   table1
    -- joins, links, and filtering: 
           inner join table6  on table1.field_1 = table6.code1
           inner join table5  on (table6.code = table5.code1)
                              AND (table6.code = table5.code) 
            left join table3  on table6.ent1 = table3.ent_code
            left join table2  on table1.extid = table2.extID
    where  table1.tdate between '01-APR-19' and '01-APR-21'
    AND    table1.refe NOT IN ('OFF')
  ) x
  -- sample rows:
  where rn <= 2
) y
);

如果有人有办法让我更好地指定这些字段来自哪些表,请告诉我。我希望我能做这样的事情:

y.table2.field1 as PRODUCT,
y.table2.field2 as PRODUCT_TYPE,
y.table3.entity,
y.table3.TYPE1

对不起,我没有可用的小提琴!

【问题讨论】:

  • 您使用的是SELECT table1.*,因此很容易确定它们的来源;他们都来自table1,而不是任何其他表。
  • 以上是我针对这个问题的原始问题的链接
  • 该链接表明您正在看到“与连接图的其余部分断开连接”,这是 SQL Developer 警告,而不是错误,并且并不总是可靠 - 如果您使用的是旧版本版本,升级,看看它是否会自行消失。或者您是否也遇到了真正的 ORA-nnnnn 错误?无论哪种方式,我都不确定您为什么不在问题中包含该信息。
  • 那么您遇到了什么错误,为什么不想告诉我们?

标签: sql oracle


【解决方案1】:

如果有人有办法让我更好地指定这些字段来自哪些表,请告诉我。

不要使用select *。相反,请使用列名并为其提供适当的别名,以便您知道它们的来源:

举个例子:

SELECT small_value,
       medium_value,
       big_value
FROM   (
  SELECT small.value  AS small_value,
         medium.value AS medium_value,
         big.value    AS big_value
  FROM   big
         CROSS JOIN medium
         CROSS JOIN small
)
WHERE  1 = 1

在您的查询中,除了在y 中使用SELECT * 或在x 中使用SELECT table1.*,您还可以命名列并为其赋予描述性别名。

在“y”中引用变量时,第 4 行出现错误。

(
select 
       -- categorization fields: 
       -- table2.field1 as PRODUCT, table2.field2 as PRODUCT_TYPE, table3.entity, table3.TYPE1

这是因为您看不到 TABLE2TABLE3,因为您正在查看的唯一“视图”是别名为 y 的子查询。

如果您想查看这些列,则需要在 x 子查询中 SELECT 它们并将它们传递给每个后续的外部查询。

(
  select *
  from   (
    -- table references:
    select table1.field1 AS t1_product,
           table1.field2 AS t1_product_type,
           table1.entity AS t1_entity,
           table1.type1  AS t1_type1,
           table2.field1 AS t2_product,
           table2.field2 AS t2_product_type,
           table2.entity AS t2_entity,
           table2.type1  AS t2_type1,
           table3.field1 AS t3_product,
           table3.field2 AS t3_product_type,
           table3.entity AS t3_entity,
           table3.type1  AS t3_type1,
           row_number() over (
             partition by
             -- categorization fields: 
             table2.field1,
             table2.field2,
             table3.entity,
             table3.TYPE1 
             order by table3.entity
           ) as rn
    -- table references
    from   table1
    -- joins, links, and filtering: 
           inner join table6  on table1.field_1 = table6.code1
           inner join table5  on (table6.code = table5.code1)
                              AND (table6.code = table5.code) 
            left join table3  on table6.ent1 = table3.ent_code
            left join table2  on table1.extid = table2.extID
    where  table1.tdate between '01-APR-19' and '01-APR-21'
    AND    table1.refe NOT IN ('OFF')
  ) x
  -- sample rows:
  where rn <= 2
);

【讨论】:

  • 感谢这个想法。问题是我想做一个 select * 因为 table1 中有几十个变量所以列出它们会非常不方便。我希望拉出所有领域,这就是我这样做的原因 *
  • @KyleStrougo 当您在两个不同的连接表中具有相同名称的列时,您不能。您需要为至少一个连接表的列提供别名,以便列名是唯一的。所以,在你的情况下,SELECT * 不能在最里面的查询中工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多