繁体   English   中英

如何从第二个表中选择前 x 条记录

[英]How to select first x records from second table

我想从第一个表中获取所有记录,从第二个表中只获取 x 条记录。
第二个表中有多少条记录我在第一个表中有信息:

我的桌子是

表格1 :

WITH table1(a,b) AS
(
 SELECT 'aa',3 FROM dual UNION ALL
 SELECT 'bb',2 FROM dual UNION ALL
 SELECT 'cc',4 FROM dual
)
SELECT *
  FROM table1;
a  | b (number of records from table2 (x))
------
aa | 3
bb | 2
cc | 4

表2:

WITH table2(a,b) AS
(
 SELECT 'aa','1xx' FROM dual UNION ALL
 SELECT 'aa','2yy' FROM dual UNION ALL
 SELECT 'aa','3ww' FROM dual UNION ALL  
 SELECT 'aa','4zz' FROM dual UNION ALL 
 SELECT 'aa','5qq' FROM dual UNION ALL 
 SELECT 'bb','1aa' FROM dual UNION ALL 
 SELECT 'bb','2bb' FROM dual UNION ALL 
 SELECT 'bb','3cc' FROM dual UNION ALL  
 SELECT 'cc','1oo' FROM dual UNION ALL 
 SELECT 'cc','2uu' FROM dual UNION ALL 
 SELECT 'cc','3tt' FROM dual UNION ALL 
 SELECT 'cc','4zz' FROM dual UNION ALL 
 SELECT 'cc','5rr' FROM dual
)
SELECT *
  FROM table2;
a  | b 
--------
aa | 1xx 
aa | 2yy 
aa | 3ww 
aa | 4zz 
aa | 5qq
bb | 1aa
bb | 2bb
bb | 3cc
bb | 4dd
bb | 5ee
cc | 1oo
cc | 2uu
cc | 3tt
cc | 4zz
cc | 5rr 

预期结果:

a  | b 
--------
aa | 1xx
aa | 2yy
aa | 3ww
bb | 1aa
bb | 2bb
cc | 1oo
cc | 2uu
cc | 3tt
cc | 4zz

您可以将ROW_NUMBER()分析函数与表之间的LEFT/RIGHT OUTER JOIN使用:

WITH t2 AS
(
SELECT t2.a,t2.b, ROW_NUMBER() OVER (PARTITION BY t2.a ORDER BY t2.b) AS rn
  FROM table2 t2
)
SELECT t2.a, t2.b
  FROM t2  
  LEFT JOIN table1 t1
    ON t1.a = t2.a  
 WHERE rn <= t1.b

演示

你需要写一些类似的东西:

SELECT a,
       b
FROM   Table2 T, 
      ( SELECT LEVEL L FROM DUAL 
        CONNECT BY LEVEL <= (SELECT MAX(b) FROM Table1) 
      ) A 
WHERE T.b>= A.L 
ORDER BY T.a;

理想情况下,您应该在 table2 中有一个排序列。 当您说前 X 行时,除非您有诸如 id 或 date 字段之类的内容来对记录进行排序,否则它没有任何意义。

无论如何,假设表 2 中 b 列的数字部分进行排序,并假设数字后跟 2 个字符,例如 xx,yy 等,您可以使用下面的逻辑

Select Tb1.a, Tb1.b
from
(Select t.*, row_number() over (partition by a order by substr(b,1,length(b)-2)) as seq
 from Table2 t) Tb1
 join Table1 Tb2
on Tb1.a = Tb2.a
Where Tb1.seq <= Tb2.b;

演示 - https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=3030b2372bcbb007606bbb6481af9884

同样,这只是横向的工作:

WITH prep AS 
( 
       SELECT * 
       FROM   tab1, 
              LATERAL 
              ( 
                     SELECT LEVEL AS lvl
                     FROM   dual 
                     CONNECT BY LEVEL <= b 
              ) 
) 
SELECT   p.a, t2.b
FROM     prep p 
JOIN     tab2 t2 
ON       p.lvl = regexp_substr(t2.b,'^\d+')
AND      p.a = t2.a 
ORDER BY p.a, p.lvl

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM