2016-09-20 70 views
0

我有一個很大的,有點難以處理的Oracle查詢,可以生成數千條記錄。我現在必須添加一個新的字段,爲每條記錄生成一個代碼值。該代碼值的格式:返回4條每條記錄的略微不同的副本

<A|B><1|2><city> 

這裏,<city>是查詢返回的字段。最終的數據集需要有每個記錄的4份:例如,如果城市是波士頓,那麼代碼值是:

A1Boston 
A2Boston 
B1Boston 
B2Boston 

一切都在這4條人需要是相同的,而且我必須爲原始查詢中的每條記錄生成這4條記錄。

是否有一種編程方法可以做到這一點,除了(1)用代碼值組合創建臨時表,然後加入它,或(2)選擇一個變量並迭代它?實際上我必須爲其他幾個同樣大的查詢做同樣的事情,所以我想做一些可重複的事情,如果可能的話。

謝謝!

+0

代碼是動態的還是固定的? – Boneist

回答

0

如果我理解你的需求,這可能是解決辦法:

with test(something, city) as 
(
    select 1, 'Boston' from dual union all 
    select 1, 'Boston' from dual union all 
    select 1, 'Boston' from dual union all 
    select 1, 'Boston' from dual union all 
    select 1, 'Boston' from dual union all 
    select 6, 'N.Y.' from dual union all 
    select 6, 'N.Y.' from dual union all 
    select 6, 'N.Y.' from dual union all 
    select 7, 'L.A.' from dual union all 
    select 7, 'L.A.' from dual 
) 
select case when RN in (1, 2) then 'A' else 'B' end 
     || 
     case when RN in (1, 3) then '1' else '2' end, 
     city, 
     something 
from (
     select city, something, row_number() over (partition by city order by null) as RN 
     from test 
    ) 
where RN <= 4   
0

,你可以使用子查詢生成一個前綴值,並且比你的查詢加入它

select 
    prefix || city, field1, field2 ... 
from 
    (select city, field1, field2 ... /* your query */) 
cross join 
    (select 'A1' as prefix from dual 
    UNION ALL 
    select 'A2' as prefix from dual 
    UNION ALL 
    select 'B1' as prefix from dual 
    UNION ALL 
    select 'B2' as prefix from dual 
) 

選擇

1

假設代碼值是靜態的,也許這會給你如何做到這一點的想法:

WITH sample_data AS (SELECT 1 ID, 'Boston' city FROM dual UNION ALL 
        SELECT 2 ID, 'New York' city FROM dual UNION ALL 
        SELECT 3 ID, 'Detroit' city FROM dual) 
SELECT dummy1.col1||dummy2.col1||sd.city results 
FROM sample_data sd 
     CROSS JOIN (SELECT 'A' col1 FROM dual UNION ALL 
        SELECT 'B' col1 FROM dual) dummy1 
     CROSS JOIN (SELECT LEVEL col1 
        FROM dual 
        CONNECT BY LEVEL <= 2) dummy2 
ORDER BY sd.city, dummy1.col1, dummy2.col1; 

RESULTS 
------------------------------------------------- 
A1Boston 
A2Boston 
B1Boston 
B2Boston 
A1Detroit 
A2Detroit 
B1Detroit 
B2Detroit 
A1New York 
A2New York 
B1New York 
B2New York 

通過使用兩個交叉連接,您可以更輕鬆地在代碼值發生變化時修改查詢,例如, < A | B | C > < 1 | 2 | 3 | 4 > <城市> - 如果您對行進行硬編碼以交叉連接(例如,'A1','A2','A3'等),您將擁有寫出所有12個組合,而不是僅使用代碼值中的7個指定值。

+0

這個解決方案也得到了我的投票 - 笛卡爾(或「交叉」)連接是這類問題的最佳解決方案。 – mathguy

+0

@Boneist完美,這正是我所需要的(而且它也很優雅)。我昨天試了一下,效果很好。謝謝你的幫助! – Nester