Oracle SQL:限制多个where子句

时间:2015-02-17 03:17:33

标签: sql oracle

如果这似乎与this question重复,请道歉,但我相信我的用例略有不同。

我有两张桌子。

Table1

ID                  INTCODE
-----------------------------
000019827364        1
000019829201        2
890418392101        3
890418390395        4
890418398677        5
505586578932        6
505586578914        7
505586578933        8
505586578012        9
490201827383        10
490201827466        11
001952046578        12


Table2

INTCODE     Category
-------------------------
1           Display
2           Display
3           Display
4           Display
5           Display
6           Audio
7           Audio
8           Audio
9           Audio
10          Audio
11          Audio
12          Audio

我期望的查询结果是每个类别的所有可能的5位前缀,并且在每个前缀中 - 我想提取至少2个完整ID。下面是一个例子,如果我有一个类别的where子句为'显示'。

ID PREFIX       Category    ID  
----------------------------------------------- 
00001           Display     000019827364
00001           Display     000019829201
89041           Display     890418392101
89041           Display     890418390395

我目前的查询是

SELECT
    SUBSTR(t1.ID, 1, 5)
FROM
    table1 t1
    ,table2 t2
WHERE
    AND UPPER(t2.category) = 'DISPLAY'
    AND t2.REGION_ID = 1
    AND t2.ZONE_ID = 2
    AND t1.REGION_ID = 1
    AND t1.ZONE_ID = 2
    AND t1.INTCODE = t2.INTCODE
GROUP BY
    SUBSTR(t1.ID, 1, 5)

我现在有点迷茫。我应该在我说

的地方运行另一个查询
t1.ID LIKE '00001%'
OR LIKE '89041%'

此列表将继续是巨大的,因为某些类别有400-500个前缀。有没有更好的方法来解决这个问题?可能在一个查询中?

我正在使用Oracle SQL。

非常感谢!

2 个答案:

答案 0 :(得分:1)

您可以使用row_number()

select Category, ID, IDPrefix
from (select Category, ID, SUBSTR(ID, 1, 5) as IDPREFIX,
             ROW_NUMBER() OVER (PARTITION BY SUBSTR(ID, 1, 5) ORDER BY ID) as seqnum
      FROM table1 JOIN
           table2 t2
           ON t1.INTCODE = t2.INTCODE ANd
              t1.Region_id = t2.Region_id and
              t1.zone_id = t2.zone_id
      WHERE UPPER(t2.category) = 'DISPLAY'
     ) t
WHERE seqnum <= 2;

答案 1 :(得分:0)

假设您可以显示具有不同Id的两行,而不再有任何约束,您可以简单地使用union,其中第一个查询将选择最大ID,第二个查询最小ID。

所以你的查询看起来像这样

select id_prefix, category, max(id)
from yourTable
union
select id_prefix, category, min(id)
from yourTable

现在只需在此算法中添加您的条件。