выбор оракула от союза выбора - PullRequest
0 голосов
/ 07 мая 2018

Просто мне нужно получить общее количество комментариев. Так что мой запрос нужно выбрать и посчитать. Вот мой 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) 

Я получил эту ошибку: [Err] ORA-00904: "F". "CUSTOMID": неверный идентификатор

1 Ответ

0 голосов
/ 07 мая 2018

Ваша таблица CRM_FEEDBACK_COMMENTS использует CRM_FEEDBACK.rowid в качестве внешнего ключа. Это плохой дизайн по нескольким причинам.

  1. Это не настоящий внешний ключ, потому что мы не можем создать реальный ограничение, ссылающееся на родительский ROWID.
  2. ROWID не является гарантированным значением: строки могут перемещаться (хотя и редко) в в этом случае ваши записи ребенка осиротели.
  3. Когда вы открываете соединения, это боль в шее - писать соединения.

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) 
...