oracle从联合选择中选择计数

时间:2018-05-07 13:54:13

标签: sql oracle union

我需要获得全面评论。所以我的查询需要选择和计数。这是我的sql。我对 total_comments

有疑问
SELECT customid, 
       dt, 
       customer_name, 
       e_mail, 
       phone, 
       TYPE, 
       message, 
       crm_status_id,
       total_comments
FROM   (SELECT f.ROWID                                AS customid, 
               f.dt                                   AS d, 
               To_char(f.dt, 'YYYY-MM-DD HH24:MI:SS') AS dt, 
               f.first_name 
               || ' ' 
               || f.middle_name 
               || ' ' 
               || f.last_name                         AS customer_name, 
               f.e_mail, 
               f.phone, 
               Decode(f.feedback_type, 'CALLBACK', 'CALLBACK', 
                                       'FEEDBACK')    AS TYPE, 
               f.feedback_message                     AS message, 
               f.crm_status_id                        AS crm_status_id,
               (SELECT COUNT(*) FROM CRM_FEEDBACK_COMMENTS WHERE CRM_FEEDBACK_COMMENTS.FEEDBACK_ROW_ID = f.customid) as total_comments
        FROM   crm_feedback f 
        UNION ALL 
        SELECT g.ROWID                                       AS customid, 
               create_date                                   AS d, 
               To_char(create_date, 'YYYY-MM-DD HH24:MI:SS') AS dt, 
               c.customer_name1                              AS customer_name, 
               p.email, 
               p.phone, 
               'MOBILSHOBE FEEDBACK'                         AS TYPE, 
               g.message_body                                AS message, 
               g.crm_status_id                               AS crm_status_id,
               (SELECT COUNT(*) FROM CRM_FEEDBACK_COMMENTS WHERE FEEDBACK_COMMENTS.FEEDBACK_ROW_ID = g.customid) as total_comments             
        FROM   feedback g 
               inner join sttm_customer@fcc_dblink c 
                       ON c.customer_no = g.customer_no 
               inner join pg2_customer@fcc_dblink p 
                       ON p.cif = g.customer_no) 

我收到此错误:[错误] ORA-00904:" F"。" CUSTOMID":无效标识符

1 个答案:

答案 0 :(得分:1)

您的表CRM_FEEDBACK_COMMENTS使用CRM_FEEDBACK.rowid作为外键。由于几个原因,这是糟糕的设计。

  1. 这不是真正的外键,因为我们无法构建实际的外键 约束引用父ROWID。
  2. ROWID不是保证值:行可以移动(尽管很少) 你的孩子记录是孤儿的情况。
  3. 正如你所发现的那样,编写连接是一种痛苦。
  4.   

    ORA-00904:“F”。“CUSTOMID”:标识符无效

    您收到此错误消息是因为我们无法将列别名传递给标量游标。要解决原始问题,您需要将CRM_FEEDBACK.rowid置于CRM_FEEDBACK_COMMENTS.FEEDBACK_ROW_ID的同一范围内。您可以使用内联视图(即FROM子句中的子查询)执行此操作:

       SELECT g.ROWID                                       AS customid, 
               create_date                                   AS d, 
               To_char(create_date, 'YYYY-MM-DD HH24:MI:SS') AS dt, 
               c.customer_name1                              AS customer_name, 
               p.email, 
               p.phone, 
               'MOBILSHOBE FEEDBACK'                         AS TYPE, 
               g.message_body                                AS message, 
               g.crm_status_id                               AS crm_status_id,
        FROM   feedback g 
               left outer join 
                   (SELECT FEEDBACK_ROW_ID, COUNT(*) as total_comments  
                    FROM CRM_FEEDBACK_COMMENTS 
                    group by FEEDBACK_ROW_ID) comm
                    on chartorowid(comm.FEEDBACK_ROW_ID) = g.ROWID       
               inner join sttm_customer@fcc_dblink c 
                       ON c.customer_no = g.customer_no 
               inner join pg2_customer@fcc_dblink p 
                       ON p.cif = g.customer_no)