2017-07-28 103 views
1

不知您是否可以幫助我?我是新來的SQL,我真的很苦惱這個查詢。我環顧四周,但是很新,我很快就感到困惑!創建SQL查詢將多個相關行組合在一起

我爲一組企業客戶繼承了不同地址的表。該表位於Oracle 12c服務器上,我正在使用SQL Developer。

我想將此信息附加到另一個查詢的末尾,以便人們在結束報告中查看單個客戶的所有相關信息更容易一些。

該表是佈局像這樣:

| CUST_ID | ADDRESS_TYPE | CONTACT_NAME | ADDRESS | CITY | ... | 
------------------------------------------------------------------ 
|  1000|   SITE |  A SMITH | A ROAD | A TOWN | 
|  1000|  BUILDER |  B JONES | B ROAD | B TOWN | 
|  1000| ARCHITECT |  A BROWN | C ROAD | A CITY | 
|  1001|   SITE |  B SMITH | A LANE | C TOWN | 
|  1001| ARCHITECT |  D BROWN | D ROAD | B CITY | 
|  1002|   SITE |  E SMITH | B LANE | D TOWN | 
|  1002| ARCHITECT |  C JONES | B ROAD | A CITY | 
|  1002|  BUILDER |  F SMITH | C LANE | B TOWN | 

我想創造的是:

| CUST_ID | SITE_NAME | SITE_ADDRESS | SITE_TOWN | BUILDER_NAME | BUILDER_ADDRESS | BUILDER_TOWN | ... | 
| 1000 | A SMITH |  A ROAD | A TOWN |  B JONES |   B ROAD |  B TOWN | ... | 
| 1001 | B SMITH |  A LANE | A TOWN |   NULL |   NULL |   NULL | ... | 
| 1002 | E SMITH |  B LANE | D TOWN |  F SMITH |   C LANE |  B TOWN | ... | 

有3 ADDRESS_TYPE,我感興趣的是:SITEBUILDERARCHITECT。因此,我不希望每CUST_IDADDRESS_TYPE有一行,我想每CUST_ID得到一行,每個ADDRESS_TYPE的尋址信息作爲額外的列。我將使用CUST_ID將結果加入另一個查詢。

我不知道我是否應該嘗試多個連接或是否可以做某種子查詢?

非常感謝您的時間和幫助,我真的很感激它!

回答

1

您還可以使用加入

SELECT 
    BASE.CUST_ID, 
    SITE.CONTACT_NAME AS SITE_NAME, 
    SITE.ADDRESS AS SITE_ADDRESS, 
    SITE.CITY AS SITE_CITY, 
    BUILDER.CONTACT_NAME AS BUILDER_NAME, 
    BUILDER.ADDRESS AS BUILDER_ADDRESS, 
    BUILDER.CITY AS BUILDER_CITY, 
    ARCHITECT.CONTACT_NAME AS ARCHITECT_NAME, 
    ARCHITECT.ADDRESS AS ARCHITECT_ADDRESS, 
    ARCHITECT.CITY AS ARCHITECT_CITY 
FROM (SELECT DISTINCT CUST_ID FROM TABLE_YOU_DID_NOT_NAME) BASE 
LEFT JOIN TABLE_YOU_DID_NOT_NAME SITE ON BASE.CUST_ID = SITE.CUST_ID AND SITE.ADDRESS_TYPE = 'SITE' 
LEFT JOIN TABLE_YOU_DID_NOT_NAME BUILDER ON BASE.CUST_ID = BUILDER.CUST_ID AND BUILDER.ADDRESS_TYPE = 'BUILDER' 
LEFT JOIN TABLE_YOU_DID_NOT_NAME ARCHITECT ON BASE.CUST_ID = ARCHITECT.CUST_ID AND ARCHITECT.ADDRESS_TYPE = 'ARCHITECT' 
+0

感謝Hogan,我不確定在重複引用同一個表時連接是否合適。我認爲它可能真的效率低下,但現在我知道只是放棄它!再次感謝您的幫助 – Nikkunaku

+0

@Nikkunaku - 根據表格的大小和定義的索引,這樣可以比使用聚合更快 – Hogan

+0

我最終試用了兩種方法,並且您的聯合版本在1.74秒內獲得了380k結果而對於條件聚合方法只有不到10秒。因爲它更容易看到發生了什麼並且更快,所以將其更改爲答案。再次感謝您的幫助:D – Nikkunaku

1

可以使用條件彙總:

select cust_id, 
     max(case when address_type = 'Site' then Contact_Name end) as site_name, 
     max(case when address_type = 'Site' then Town end) as site_town, 
     max(case when address_type = 'Site' then Address end) as site_address, 
     max(case when address_type = 'Builder' then Contact_Name end) as builder_name, 
     max(case when address_type = 'Builder' then Town end) as builder_town, 
     max(case when address_type = 'Builder' then Address end) as builder_address, 
     . . . 
from t 
group by cust_id; 
+0

Oooh這對我來說是全新的,謝謝!它的工作,它真的很快!感謝您的幫助Gordon,我將把條件彙總添加到我的列表中,以便詳細瞭解:D – Nikkunaku

0

或者你可以使用PIVOT(只是要詳盡的不同的解決方案)

Link to SQLFiddle

select * from addresses 
pivot ( 
    MAX(CONTACT_NAME) CONTACT_NAME, 
    MAX(ADDRESS) ADDRESS, 
    MAX(CITY) CITY 
    FOR ADDRESS_TYPE IN ('SITE','BUILDER','ARCHITECT')); 

@OP:我會好奇時間的。我想必須像聚合方法