如何从第二张表中选择第一条x记录

问题描述

我想从第一个表中获取所有记录,而从第二个表中仅获取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

table2:

WITH table2(a,'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

Demo

,

您需要编写如下内容:

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;
,

理想情况下,您应该在表2中有一个订购栏。当您说前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

enter image description here

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...