oracle查询问题

1、查询一个表中两个字段同时满足另一个字段的要求。

2、例如:在qlr这个表中,有三个字段BH,QLRLX,QLRMC。

img

需要让相同BH的QLRLX是“权利人”和“义务人”两条数据的QLRMC的字数同时大于5。如果权利人或者义务人有一条QLRMC的字数小于5就查不到这个BH。

3、SELECT * FROM qlr WHERE (QLRLX='权利人' OR QLRLX='义务人' ) AND LENGTH (QLRMC) >5,这样是不对的,这样的查出的结果不能满足QLRMC字段的字数同时大于5

--请验证采纳,谢谢
--1.思路:
--找到有相同的BH,对长度>5进行过滤
--2.实现脚本:
select *
from qlr
where BH inselect BH from qlr group by BH having count(1) >1and length(QLRMC) >5
and QLRLX in'权利人''义务人');

直接sql ,应该是无法实现的,但是可以通过自定义函数,以及使用 group by 实现

  1. Create FUNCTION AddString
    (
     @Id int
    )
    RETURNS varchar(1024)
    AS
    BEGIN
     declare @Str varchar(1024)
     set @Str = ''
     select @Str = @Str + [Name] from yourTable
     where [BH] = @Id
     return @Str
    END
    GO
    
  2. 然后通过group by
    select * from (
    select BH,dbo.AddString(BH) as c_QLRLX,max(QLRMC) from yourTableName
    group by BH having count(*) > 2) as t
    where length(QLRMC )>5 and c_QLRLX in('权利人义务人','义务人权利人')

看看这段sql对你有帮助麽

with map1 as (select * from qlr where qlrlx = '权利人' and length (qlrmc)>5 ),
map2 as (select * from qlr where qlrlx = '义务人' and length(qlrmc) >5)
select * from map1 left join map2 m2 on m2.bh=m1.bh  where length(m1.qlrmc)>5 and length (m2.qlrmc)>5 

SELECT A1.*
FROM QLR A1
INNER JOIN QLR A2
ON A1.BH = A2.BH
AND A1. QLRLX = '权利人'
AND LENGTH(A1.QLRMC) > 5
AND A2. QLRLX = '义务人'
AND LENGTH(A2.QLRMC) > 5




-- 建表
create table test_table(BH varchar2(20),
QLRMC varchar2(100),
QLRLX varchar2(50));
-- 注释 字段
comment on column test_table.bh is '编号';
comment on column test_table.qlrmc is '权利人名称';
comment on column test_table.qlrlx is '权利人类型';

-- 插入数据
insert into test_table (bh, qlrmc, qlrlx) values ('BH001', '张三', '权利人');
insert into test_table (bh, qlrmc, qlrlx) values ('BH001', '张三四', '义务人');
insert into test_table (bh, qlrmc, qlrlx) values ('BH002', '张三四五', '义务人');
insert into test_table (bh, qlrmc, qlrlx) values ('BH002', '张三四五六', '权利人');
insert into test_table (bh, qlrmc, qlrlx) values ('BH003', '张三四五六七', '义务人');
insert into test_table (bh, qlrmc, qlrlx) values ('BH003', '张三四五六七八', '权利人');
insert into test_table (bh, qlrmc, qlrlx) values ('BH004', '张三四五六七八九', '义务人');
insert into test_table (bh, qlrmc, qlrlx) values ('BH004', '张三四五六七八九十', '权利人');
insert into test_table (bh, qlrmc, qlrlx) values ('BH005', '张三四五六七八九十一', '义务人');
insert into test_table (bh, qlrmc, qlrlx) values ('BH005', '张三四五六七八九十一一', '权利人');


-- 查询满足条件数据


select *
  from test_table
 where bh in (select t1.bh
              /*找最小 QLRMC,如果最小都大于5,那么说明所有都大于5*/
                from test_table t1
               where exists (select 1
                      /*找重复编号的,即相同*/
                        from (select bh
                                from test_table
                               group by bh
                              having count(1) > 1) t2
                       where t1.bh = t2.bh)
               group by t1.bh
              having min(length(t1.qlrmc)) > 5);

原表
       BH    QLRMC    QLRLX
1    BH001    张三    权利人
2    BH001    张三四    义务人
3    BH002    张三四五    义务人
4    BH002    张三四五六    权利人
5    BH003    张三四五六七    义务人
6    BH003    张三四五六七八    权利人
7    BH004    张三四五六七八九    义务人
8    BH004    张三四五六七八九十    权利人
9    BH005    张三四五六七八九十一    义务人
10    BH005    张三四五六七八九十一一    权利人

结果

       BH    QLRMC    QLRLX
1    BH003    张三四五六七    义务人
2    BH003    张三四五六七八    权利人
3    BH004    张三四五六七八九    义务人
4    BH004    张三四五六七八九十    权利人
5    BH005    张三四五六七八九十一    义务人
6    BH005    张三四五六七八九十一一    权利人


如果是需要的结果,望采纳

select tb1.BH from qlr tb1
left outer join qlr tb2 on tb1.BH=tb2.BH and tb2.QLRLX='义务人' and LENGTH (tb2.QLRMC) >5
where tb1.QLRLX='权利人' and tb2.QLRLX is not null and LENGTH (tb1.QLRMC) >5

img


img

select * from qlr where bh in (select bh from (SELECT bh,count(*) as total FROM qlr WHERE (QLRLX='权利人' OR QLRLX='义务人' ) AND LENGTH (QLRMC)>5 group by bh) temp where temp.total>1);

img

SELECT * FROM qlr WHERE (QLRLX='权利人' OR QLRLX='义务人' ) AND LENGTH (QLRMC) >5,这样是不对的,这样的查出的结果不能满足QLRMC字段的字数同时大于5,可以看看SELECT语法格式,以及查询方法。
之前收藏过一篇与SELECT相关的文章,讲得很不错,讲述了多种查询方式

https://blog.csdn.net/u013634252/article/details/80569386

img

img


希望对题主有所帮助!

SELECT * FROM qlr WHERE QLRLX='权利人' OR QLRLX='义务人' AND LENGTH (QLRMC) >5

如果只要提取满足条件的bh,那么可以使用下面这个sql,注意这个count(distinct )=2,也就是必须满足 权利人和义务人同时存在

select bh from qlr 
where QLRLX in ('权利人','义务人') 
and length(QLRMC) >5 
group by bh 
having count(distinct QLRLX )=2

如果是要在查询qlr表的时候,多一个字段显示是否满足要求,那么可以使用开窗函数

select qlr.*,
case when  (count(distinct  (case when QLRLX in ('权利人','义务人') and length(QLRMC) >5 then  QLRLX end)) over(partition by BH) )=2 then 'Y' else 'N' END FLAG
 from qlr

另外,我不确定你这个数据里,对于同一个BH是否会存在多个权利人或者多个义务人,如果有的话,你先得说明一下,如果存在一个权利人和一个义务人满足条件,但存在另一个权利人不满足条件,那么这个BH是否还满足条件?
如果这种情况属于不满足,那么LENGTH判断就不能放在where里面,而是应该在查询count里用case when加length去和不带length条件的count去判断

这个使用in的语句即可实现

SELECT * FROM qlr WHERE LENGTH (QLRMC) >5  and QLRLX in ('权利人','义务人' )

将QLRMC字数小于5的这部分数据查出来取其对应的BH,然后将这部分BH过滤掉即可:
SELECT BH,QLRLX,QLRMC
FROM qlr
WHERE BH NOT IN (
SELECT BH FROM qlr WHERE LENGTH(QLRMC) < 5
)

其实可以根据实际业务去思考这个问题,题主这个LENGTH (QLRMC) >5 这个目的是什么,这个如果清楚了,这个sql就很简单了,要是我的做法,我会关联一下,先变成宽表处理

SELECT * FROM qlr aa
inner join qlr bb
on aa.BH=bb.BH
and aa.QLRLX!=bb.QLRMC
当然还得看你那边实际表里面数据,这样关联是否会出现重复数据

这样会生成一条数据 BH(主键),权利人,公司

排除法,排除qlrmc<=5的BH


SELECT
    q1.BH,
    q1.QLRLX,
    q1.QLRMC
FROM
    qlr q1
WHERE
    (
        q1.QLRLX = '权利人'
        OR q1.QLRLX = '义务人'
    )
    AND NOT EXISTS(
        SELECT
            *
        FROM
            qlr q2
        WHERE
            q1.BH = q2.BH
            AND LENGTH (q2.QLRMC) <= 5
    );

select * from ( select BH,count(distinct QLRLX) from qlr where length(QLRMC )>5 group by BH having count(distinct QLRLX) >1 )

https://ask.csdn.net/questions/853149?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-2.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-2.pc_feed_download_top3ask