1、查询一个表中两个字段同时满足另一个字段的要求。
2、例如:在qlr这个表中,有三个字段BH,QLRLX,QLRMC。
需要让相同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 in(
select BH from qlr group by BH having count(1) >1
)
and length(QLRMC) >5
and QLRLX in('权利人','义务人');
直接sql ,应该是无法实现的,但是可以通过自定义函数,以及使用 group by 实现
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
看看这段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
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);
SELECT * FROM qlr WHERE (QLRLX='权利人' OR QLRLX='义务人' ) AND LENGTH (QLRMC) >5,这样是不对的,这样的查出的结果不能满足QLRMC字段的字数同时大于5,可以看看SELECT语法格式,以及查询方法。
之前收藏过一篇与SELECT相关的文章,讲得很不错,讲述了多种查询方式:
https://blog.csdn.net/u013634252/article/details/80569386
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 )