【问题标题】:How retrieve nested table when using union使用联合时如何检索嵌套表
【发布时间】:2020-02-09 04:27:50
【问题描述】:

我正在尝试从 sql 视图中的嵌套表中检索数据,但是当我想添加联合时,oracle 会显示 inconsistent data type.)。

当我这样做时:

    CREATE OR REPLACE FORCE VIEW MY_VIEW
(
    VAR_1,
    VAR_2,
    VAR_3,
    VAR_4,
    VAR_5
)
    BEQUEATH DEFINER
AS
    SELECT 
           '0-0'            CHILD_ENTITY_ID,
           NULL             PARENT_ENTITY_ID,
           T2.LEVEL_ID      ENTITY_ID,
           NULL             PARENT_LEVEL_TYPE_ID,
          (SELECT ALERT_DAYS FROM TABLE(T6.ALERT_DAYS)) ALERT_DAYS
      FROM MA_TABLE_1    T1,
           MA_TABLE_2    T2,
           MA_TABLE_3    T3,
           MA_TABLE_4    T4,
           MA_TABLE_5    T5,
           MA_TABLE_6    T6,
           MA_TABLE_7    T7
     WHERE     T1.LEVEL_TYPE_ID = 0
           AND T1.LEVEL_TYPE_ID = T2.LEVEL_TYPE_ID
           AND T4.RATE_ID = T2.RATE_ID
           AND T4.COUNTER_DIVIDED_ID = T5.COUNTER_ID
           AND T2.ALERT_ID = T6.ALERT_ID(+)
           AND T2.RATE_ID = T7.RATE_ID
    UNION
    SELECT 
           '1-' || T2.OPERATOR_ID CHILD_ENTITY_ID,
           '0-0'                  PARENT_ENTITY_ID,
           T2.OPERATOR_ID         ENTITY_ID,
           0                      PARENT_LEVEL_TYPE_ID,
          (SELECT ALERT_DAYS FROM TABLE(T6.ALERT_DAYS)) ALERT_DAYS
      FROM MA_TABLE_3             T2,
           MA_TABLE_2             T3,
           MA_TABLE_4             T4,
           MA_TABLE_5             T5,
           MA_TABLE_6             T6,
           MA_TABLE_7             T7
     WHERE     ((T3.LEVEL_TYPE_ID = 1 AND T3.LEVEL_ID = T2.OPERATOR_ID))
           AND T3.LEVEL_TYPE_ID =
                   (SELECT MAX (T4.LEVEL_TYPE_ID)
                      FROM SMS_MONITORING_THRESHOLD T4
                     WHERE ((T4.LEVEL_TYPE_ID = 1
                           AND T4.LEVEL_ID = T2.OPERATOR_ID))
                           AND T4.RATE_ID = T3.RATE_ID
                           AND T3.CHANNEL_ID = T4.CHANNEL_ID)
           AND T4.RATE_ID = T3.RATE_ID
           AND T4.COUNTER_DIVIDED_ID = T5.COUNTER_ID
           AND T3.ALERT_ID = T6.ALERT_ID(+)
           AND T3.RATE_ID = T7.RATE_ID;

我收到一条错误消息,提示“错误的数据类型”。

我也尝试添加 to_char(...ALERT_DAYS) 但没有成功。

我成功避免了这次更新的错误:

    CREATE OR REPLACE FORCE VIEW MY_VIEW
(
    VAR_1,
    VAR_2,
    VAR_3,
    VAR_4,
    VAR_5
)
    BEQUEATH DEFINER
AS
    SELECT 
           '0-0'            CHILD_ENTITY_ID,
           NULL             PARENT_ENTITY_ID,
           T2.LEVEL_ID      ENTITY_ID,
           NULL             PARENT_LEVEL_TYPE_ID,
          T8.*
      FROM MA_TABLE_1    T1,
           MA_TABLE_2    T2,
           MA_TABLE_3    T3,
           MA_TABLE_4    T4,
           MA_TABLE_5    T5,
           MA_TABLE_6    T6,
           MA_TABLE_7    T7,
           TABLE(T2.ALERT_DAYS) T8
     WHERE     T1.LEVEL_TYPE_ID = 0
           AND T1.LEVEL_TYPE_ID = T2.LEVEL_TYPE_ID
           AND T4.RATE_ID = T2.RATE_ID
           AND T4.COUNTER_DIVIDED_ID = T5.COUNTER_ID
           AND T2.ALERT_ID = T6.ALERT_ID(+)
           AND T2.RATE_ID = T7.RATE_ID
    UNION
    SELECT 
           '1-' || T2.OPERATOR_ID CHILD_ENTITY_ID,
           '0-0'                  PARENT_ENTITY_ID,
           T2.OPERATOR_ID         ENTITY_ID,
           0                      PARENT_LEVEL_TYPE_ID,
          T8.*
      FROM MA_TABLE_3             T2,
           MA_TABLE_2             T3,
           MA_TABLE_4             T4,
           MA_TABLE_5             T5,
           MA_TABLE_6             T6,
           MA_TABLE_7             T7,
           TABLE(T3.ALERT_DAYS) T8
     WHERE     ((T3.LEVEL_TYPE_ID = 1 AND T3.LEVEL_ID = T2.OPERATOR_ID))
           AND T3.LEVEL_TYPE_ID =
                   (SELECT MAX (T4.LEVEL_TYPE_ID)
                      FROM SMS_MONITORING_THRESHOLD T4
                     WHERE ((T4.LEVEL_TYPE_ID = 1
                           AND T4.LEVEL_ID = T2.OPERATOR_ID))
                           AND T4.RATE_ID = T3.RATE_ID
                           AND T3.CHANNEL_ID = T4.CHANNEL_ID)
           AND T4.RATE_ID = T3.RATE_ID
           AND T4.COUNTER_DIVIDED_ID = T5.COUNTER_ID
           AND T3.ALERT_ID = T6.ALERT_ID(+)
           AND T3.RATE_ID = T7.RATE_ID;

但现在我的视图没有返回任何内容,我不明白为什么,如果您有任何想法,请告诉我

【问题讨论】:

  • 这真的是代码吗?因为两个选择看起来是相同的,所以数据类型不能不同。合并两个表似乎很奇怪;因为先天的不同会消除联合查询(2nd)中的所有记录,这就像说联合(1,2)和(1,2)得到(1,2)......那么为什么联合......你'结果不会是 (1,2),(1,2)
  • 感谢您的回复,我已经更新了我原来的帖子。现在看起来更像是我的真实代码

标签: sql oracle union nested-table


【解决方案1】:

你可以试试这个

CREATE OR REPLACE FORCE VIEW MY_VIEW 
(
    ID,
    ALERT_DAYS
)
   BEQUEATH DEFINER
AS
    SELECT
         T1.ID,
         SELECT ALERT_DAYS FROM TABLE(to_number(T1.ALERT_DAYS)) ALERT_DAYS
    FROM 
        MA_TABLE T1
   UNION
    SELECT
         T1.ID,
         SELECT ALERT_DAYS FROM TABLE(to_number(T1.ALERT_DAYS)) ALERT_DAYS
    FROM 
        MA_TABLE T1

【讨论】:

  • 感谢您提出的解决方案,但我已经尝试过了,但它现在不起作用,错误提示:'inconsistent data type' expected NUMBER GOT MY_SCHEME.ALERT_DAYS_TAB
  • 我尝试使用 TO_NUMBER 作为您的示例,但现在预计会出现错误 CHAR GOT MY_SCHEME.ALERT_DAYS_TAB,这真的很奇怪
  • 所以用 TO_CHAR 试试吧
猜你喜欢
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 2013-07-01
  • 2020-11-21
  • 1970-01-01
相关资源
最近更新 更多