2016-07-22 60 views
0

谢谢,我一直在这个论坛上从慷慨的人那里得到很大的帮助。我是Oracle SQL的初学者。Oracle选择查询到许多内部查询,获取不是组表达式。来自JOIN的重复

我在两个VIEW之间有一对多的关系,这两个VIEW是PERSON_VIEW和PHONE_VIEW。在帮助下,我得到了一个查询case/when for phone to work,但是当我将它添加回我的主查询时,它影响了我与TASK_VIEW的其他连接。

我想我需要添加它作为内部查询,所以我得到一个结果。我在查询中添加了以下内容。我在TOAD中运行了查询,它给了我一个错误,“ORA-00979:不是GROUP BY表达式”,并突出显示了查询中的所有PERSON_ID。如果我采取以下左连接,它运行良好,不会输出电话号码。任何帮助表示赞赏。

我也注意到,由于我带回了3个电话号码(小区,家庭和商业),它在我从任务中返回时导致了dups。与任务内部联接, 我得到的结果一样

之前: 约翰M.李四ToDo1:ToDO1,ToDo2:ToDo2

后: 约翰M.李四ToDo1:ToDO1,ToDo1:ToDO1, ToDo1:ToDo1,ToDo2:ToDo2,ToDo2:ToDo2,ToDo2:ToDo2

我从3个case语句中取出最大值,并运行查询。但它返回一个单独的行对于每个电话号码,像这样

约翰李四999-999-9999 约翰李四888-888-8888 约翰李四222-222-2222

我怎样才能解决这个?

LEFT JOIN (SELECT PERSON_ID, PHONE_TP_SHORT_DESC, 
        max(case when PHONE_TYPE = 'HOME' then PHONE_NUMBER end) as HOME_PHONE, 
        max(case when PHONE_TYPE = 'BUSINESS' then PHONE_NUMBER end) as BUSINESS_PHONE,  
        max(case when PHONE_TYPE = 'CELL' then PHONE_NUMBER end) as CELL_PHONE 
      FROM PHONE_VIEW) PHONE 
ON PERSON.PERSON_ID = PHONE.PERSON_ID AND PHONE.PHONE_TYPE IN ('HOME','BUSINESS','CELL') 

这里是我的,我正在尝试调试

SELECT PERSON.PERSON_ID, 
     PERSON.FIRST_NAME, 
     PERSON.MIDDLE_NAME, 
     PERSON.LAST_NAME, 
     PERSON.USER_NAME, 
     PHONE.HOME_PHONE, 
     PHONE.BUSINESS_PHONE, 
     PHONE.CELL_PHONE, 

LISTAGG(case 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo1' then 'ToDo1:ToDo1' 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo2' then 'ToDo2:ToDo2' 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo3' then 'ToDo3:ToDo3' 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo4' then 'ToDo4:ToDo4' 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo5' then 'ToDo5:ToDo5' 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo6' then 'ToDo6:ToDo6' 
     else '' 

end, ',') 
WITHIN GROUP (ORDER BY TASK.TASK_DESC) AS TASK 

FROM PERSON_VIEW PERSON 

LEFT JOIN (SELECT PERSON_ID, PHONE_TP_SHORT_DESC, 
        max(case when PHONE_TYPE = 'HOME' then PHONE_NUMBER end) as HOME_PHONE, 
        max(case when PHONE_TYPE = 'BUSINESS' then PHONE_NUMBER end) as BUSINESS_PHONE,  
        max(case when PHONE_TYPE = 'CELL' then PHONE_NUMBER end) as CELL_PHONE 
      FROM PHONE_VIEW) PHONE 
ON PERSON.PERSON_ID = PHONE.PERSON_ID AND PHONE.PHONE_TYPE IN ('HOME','BUSINESS','CELL')     


LEFT JOIN (SELECT DISTINCT PERSON_ID, TASK_DESC FROM TASK_VIEW) SKILLS 
ON SKILLS.PERSON_ID = PERSON.PERSON_ID 


GROUP BY 
PERSON.PERSON_ID, 
PERSON.FIRST_NAME, 
PERSON.MIDDLE_NAME, 
PERSON.LAST_NAME, 
PERSON.USER_NAME, 
PHONE.HOME_PHONE, 
PHONE.BUSINESS_PHONE, 
PHONE.CELL_PHONE 

回答

0

我看到一个问题,您的查询的整个查询。你有LEFT JOIN下面的子查询:

(SELECT PERSON_ID, 
     PHONE_TP_SHORT_DESC, 
     max(case when PHONE_TYPE = 'HOME' then PHONE_NUMBER end) as HOME_PHONE, 
     max(case when PHONE_TYPE = 'BUSINESS' then PHONE_NUMBER end) as BUSINESS_PHONE,  
     max(case when PHONE_TYPE = 'CELL' then PHONE_NUMBER end) as CELL_PHONE 
FROM PHONE_VIEW) PHONE 

然而,在ON条件,你指的是所谓的PHONE_TYPE柱:

ON PERSON.PERSON_ID = PHONE.PERSON_ID AND 
    PHONE.PHONE_TYPE IN ('HOME','BUSINESS','CELL') 

有一个叫PHONE_TYPE没有可用的列,所以我期望从这个错误。有时,从数据库(或编译器)获得的错误消息可能会引起误解,因为它并不总是能够揭示问题的根本原因。

错误的另一个可能的原因是您正在使用视图,它们的行为与表格不同。

+0

任何有理由认为PHONE_TYPE在PHONE_VIEW表中不可用,或者只是您的猜测,或者您想说如果它不在选择列表中,就不能在where子句中使用列。 – XING

+0

别名“PHONE”是指子查询AFAIK。子查询中只有在该子查询中选择的列应该可用。 –

+0

Ohhh ..我没有看到他使用PHONE.PHONE_TYPE ....我问因为我认为他使用PHONE_VIEW.PHONE_TYPE ..我的错误 – XING