2016-09-20 63 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