oracle中,如果a表跟b表关联查询的问题

2025-01-23 11:57:38
推荐回答(5个)
回答(1):

  可以的,利用oracle的分析函数ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) 来实现。举例如下:

  1、数据准备:

  --创建A表

  CREATE TABLE qh_a (

  filed1 Varchar2(3),

  filed2 CHAR(1)

  );

  --创建B表

  CREATE TABLE qh_b (

  filed1 CHAR(1),

  filed2 VARCHAR(3)

  );

  --初始化A表与B表的数据。

  INSERT INTO qh_a VALUES('001','x');

  INSERT INTO qh_a VALUES('002','y');

  INSERT INTO qh_b VALUES('x','aaa');

  INSERT INTO qh_b VALUES('x','bbb');

  INSERT INTO qh_b VALUES('y','ccc');

  INSERT INTO qh_b VALUES('y','ddd');


  2、查询语句

  SELECT CASE

  WHEN ROW_NUMBER() OVER(PARTITION BY A.FILED2 ORDER BY B.FILED2) = 1 THEN  A.FILED1 ELSE '' END FILED1,

  A.FILED2,

  B.FILED2

  FROM QH_A A, QH_B B

  WHERE A.FILED2 = B.FILED1


  3、结果如下图所示:

回答(2):

oracle中表关联查询:
以查询emp表为例:

SELECT * FROM emp e, dept d WHERE e.deptno=d.deptno;
查询结果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAME LOC
---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- ---------
CLARK MANAGER 7839 09-6月 -81 2450 10 10 ACCOUNTING NEW YORK
KING PRESIDENT 17-11月-81 5000 10 10 ACCOUNTING NEW YORK
MILLER CLERK 7782 23-1月 -82 1300 10 10 ACCOUNTING NEW YORK
SMITH CLERK 7902 17-12月-80 800 20 20 RESEARCH DALLAS
ADAMS CLERK 7788 23-5月 -87 1100 20 20 RESEARCH DALLAS
FORD ANALYST 7566 03-12月-81 3000 20 20 RESEARCH DALLAS
SCOTT ANALYST 7566 19-4月 -87 3000 20 20 RESEARCH DALLAS
JONES MANAGER 7839 02-4月 -81 2975 20 20 RESEARCH DALLAS
ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 30 SALES CHICAGO
BLAKE MANAGER 7839 01-5月 -81 2850 30 30 SALES CHICAGO
MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 30 SALES CHICAGO
JAMES CLERK 7698 03-12月-81 950 30 30 SALES CHICAGO
TURNER SALESMAN 7698 08-9月 -81 1500 0 30 30 SALES CHICAGO
WARD SALESMAN 7698 22-2月 -81 1250 500 30 30 SALES CHICAGO

回答(3):

假设a表的量子字段是column1,column2,b表的两个字段也是conlumn1,conlumn2。sql如下:
select c3,c1,c2 from (select b.column1 c1,b.column2 c2,a.column1 c3 from b left join a on b.column1=a.column2 )

回答(4):

单独的SQL语句无法做到,可以考虑用存储过程,将结果保存在临时表里,再用查询语句获得这样的效果。

如果b表上加一列标志位,标注该行是否显示001的话,倒是可以实现,但是问题又来了,针对某个x,这个标志位应该是只有一行设为显示,其它行设为不显示,那么显示或者不显示区分的标准是什么呢?这又会增加插入数据时的复杂度。这是题外话了。

回答(5):

假设a表的量子字段是column1,column2,b表的两个字段也是conlumn1,conlumn2 。
sql:select a1.column1,b1.column2
from a a1 right join b b1
on a1.column2 = b1.column1;