2015-06-23 38 views
1

我有一個有趣的查詢,我試圖弄清楚。我有一個視圖正在添加一列。此列是來自其他表的數據,將數據轉換爲單行。現在,我需要清除這個旋轉數據中的重複條目。 Listagg非常適合將數據獲取到單行,但我需要使其獨一無二。雖然我知道如何讓它變得獨一無二,但我忽略了相關子查詢只能達到1級的事實。所以......不太確定如何獲得明確的價值列表。如果我不這樣做,我可以讓它工作。任何人都可以工作一些SQL魔術?oracle相關子查詢使用不同的listagg

的樣本數據:

drop table test; 
drop table test_widget; 

create table test (id number, description Varchar2(20)); 

create table test_widget (widget_id number, test_fk number, widget_type varchar2(20)); 

insert into test values(1, 'cog'); 
insert into test values(2, 'wheel'); 
insert into test values(3, 'spring'); 

insert into test_widget values(1, 1, 'A'); 
insert into test_widget values(2, 1, 'A'); 
insert into test_widget values(3, 1, 'B'); 
insert into test_widget values(4, 1, 'A'); 
insert into test_widget values(5, 2, 'C'); 
insert into test_widget values(6, 2, 'C'); 
insert into test_widget values(7, 2, 'B'); 
insert into test_widget values(8, 3, 'A'); 
insert into test_widget values(9, 3, 'C'); 
insert into test_widget values(10, 3, 'B'); 
insert into test_widget values(11, 3, 'B'); 
insert into test_widget values(12, 3, 'A'); 

commit; 

這裏是工作的查詢的例子,但說明重複數據:

SELECT A.ID 
    , A.DESCRIPTION 
    , (SELECT LISTAGG (WIDGET_TYPE, ', ') WITHIN GROUP (ORDER BY WIDGET_TYPE) 
      FROM TEST_WIDGET 
     WHERE TEST_FK = A.ID) widget_types 
    FROM TEST A 

這裏是什麼並沒有因深度合作的例子我嘗試引用ID:

SELECT A.ID 
    , A.DESCRIPTION 
    , (SELECT LISTAGG (WIDGET_TYPE, ', ') WITHIN GROUP (ORDER BY WIDGET_TYPE) 
      FROM (SELECT DISTINCT WIDGET_TYPE 
        FROM TEST_WIDGET 
       WHERE TEST_FK = A.ID)) 
      WIDGET_TYPES 
    FROM TEST A 

這裏是我想顯示的內容:

1 cog A, B 
2 wheel B, C 
3 spring A, B, C 

如果有人知道他們的頭頂,那太棒了!否則,我可以發佈一些示例創建語句來幫助您使用虛擬數據來確定查詢。

+1

*「我可以發佈一些示例創建語句來幫助您使用虛擬數據來計算查詢。」 - 是的,您應該這樣做。 :) – GolezTrol

+0

好吧,你有我;)我添加了示例數據。 – dvsoukup

回答

2

您可以將不同的子查詢,它也有加入 - 避免級問題:

SELECT ID 
    , DESCRIPTION 
    , LISTAGG (WIDGET_TYPE, ', ') 
     WITHIN GROUP (ORDER BY WIDGET_TYPE) AS widget_types 
FROM (
    SELECT DISTINCT A.ID, A.DESCRIPTION, B.WIDGET_TYPE 
    FROM TEST A 
    JOIN TEST_WIDGET B 
    ON B.TEST_FK = A.ID 
) 
GROUP BY ID, DESCRIPTION 
ORDER BY ID; 

     ID DESCRIPTION   WIDGET_TYPES  
---------- -------------------- -------------------- 
     1 cog     A, B     
     2 wheel    B, C     
     3 spring    A, B, C    
+0

這是一個好主意!謝謝。因爲我不想用所有額外的邏輯來破壞當前視圖,所以我實際上只是將它構建在包含這個透視數據的獨立視圖中。然後,在我們認爲需要這些數據的情況下,我只是引用了這個新創建的視圖,該視圖已經「預建」了。謝謝你幫助我在這個盒子外面思考! – dvsoukup

0

我在使用Pentaho的一個獨特情況報告的作家和一些不一致的數據。 Pentaho編寫者使用Oracle來查詢數據,但有限制。數據塊是唯一的,但以一致的方式沒有分類,所以我創建了一個嵌套LISTAGG左內聯接呈現數據我想要的方式:

   left join 
      (
      select staff_id, listagg(thisThing, ' --- '||chr(10)) within group (order by this) as SCHED_1 from 
          (
          SELECT 
          staff_id, RPT_STAFF_SHIFTS.ORGANIZATION||': '||listagg( 
          RPT_STAFF_SHIFTS.DAYS_OF_WEEK 
          , ',') within group (order by BEGIN_DATE desc) 
          as thisThing 
          FROM "RPT_STAFF_SHIFTS" where "RPT_STAFF_SHIFTS"."END_DATE" is null 
          group by staff_id, organization) 
      group by staff_id 
      ) schedule_1 on schedule_1.staff_id = "RPT_STAFF"."STAFF_ID" 
where "RPT_STAFF"."STAFF_ID" ='555555' 

這比使用嵌套不同的方法查詢,但在某些情況下,通過在開發查詢時考慮到級別問題並採取額外步驟來完全連接結果,它可能會更好。