可以的,利用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、结果如下图所示:
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
假设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 )
单独的SQL语句无法做到,可以考虑用存储过程,将结果保存在临时表里,再用查询语句获得这样的效果。
如果b表上加一列标志位,标注该行是否显示001的话,倒是可以实现,但是问题又来了,针对某个x,这个标志位应该是只有一行设为显示,其它行设为不显示,那么显示或者不显示区分的标准是什么呢?这又会增加插入数据时的复杂度。这是题外话了。
假设a表的量子字段是column1,column2,b表的两个字段也是conlumn1,conlumn2 。
sql:select a1.column1,b1.column2
from a a1 right join b b1
on a1.column2 = b1.column1;