高手请进,求一条复杂的SQL查询语句,到底怎么才能查到???
开发遇到问题,想了大半天没想到怎么弄。我把问题化简如下:数据库有两张表,B表的a_id是外键,参照A表A表(id是主键):id1B表(id是主键,a_id是外键):id|...
开发遇到问题,想了大半天没想到怎么弄。我把问题化简如下:
数据库有两张表,B表的a_id是外键,参照A表
A表(id是主键):
id
1
B表(id是主键,a_id是外键):
id | value | a_id
1 | a | 1
2 | b | 1
上面A表不一定只有一条记录,B表对于A表的一条记录(B.a_id = A.id)的时候value不一定包含('a', 'b')全部值,可能只有a,或者只有b,或者简直没有记录(select * from B where a_id = 'x')。
问题来了,我要查A表的记录,要求这条记录对应在B表中含有 'a' 值 或者含有 'b' 值或者【同时】含有'a'和'b'两个值。
数据库是mysql。
修正一下,如果我查有a值的A记录时,那A记录对应B表只有一条记录value = a;如果我查有b值的B记录时,那A记录对应B表只有一条记录value = b; 如果我查有a、b值的A记录时,那A记录对应B表有且只有两条记录value = a 和 value = b 展开
数据库有两张表,B表的a_id是外键,参照A表
A表(id是主键):
id
1
B表(id是主键,a_id是外键):
id | value | a_id
1 | a | 1
2 | b | 1
上面A表不一定只有一条记录,B表对于A表的一条记录(B.a_id = A.id)的时候value不一定包含('a', 'b')全部值,可能只有a,或者只有b,或者简直没有记录(select * from B where a_id = 'x')。
问题来了,我要查A表的记录,要求这条记录对应在B表中含有 'a' 值 或者含有 'b' 值或者【同时】含有'a'和'b'两个值。
数据库是mysql。
修正一下,如果我查有a值的A记录时,那A记录对应B表只有一条记录value = a;如果我查有b值的B记录时,那A记录对应B表只有一条记录value = b; 如果我查有a、b值的A记录时,那A记录对应B表有且只有两条记录value = a 和 value = b 展开
5个回答
展开全部
需求转换
A表记录:
id
1
2
B表记录:
id value a_id
1 a 1
2 b 1
3 c 1
4 d 2
按照你描述的,你希望查询出A表的id=1的记录,语句如下:
select *
from A1 t1
where exists (select *
from B1 t2
where t2.value in ('a', 'b')
and t2.a_id = t1.id)
追问
可能我表达能力不好,这B表的value是a、b、或者 a & b,用你这种in的话,A记录对应B表里面有a能搜出来,有b有搜出来,有a、b、c也能搜出来。而我想要的是,比如我的需求是有a和b,那他在B表里的value就只能且必须是a和b,多一个,少一个都不行。
追答
select *
from A1 t1
where exists (select *
from B1 t2
where t2.value in ('a&b')
and t2.a_id = t1.id)
展开全部
你的问题很简单,看来你基础不怎么好,不要喷我,告诉你答案。
解决方法就是左连接
select * from A t1 left join B t2 on t1.id = t2.a_id where t2.value is not null
这是oracle下的写法,自己去试试吧
解决方法就是左连接
select * from A t1 left join B t2 on t1.id = t2.a_id where t2.value is not null
这是oracle下的写法,自己去试试吧
追问
这样写只是查到A表对应在B表的value有值的记录而已,关键是那value必须等于某些组合时,where语句怎么写。。
追答
左连接那句好理解吧,不懂的话去看书,where里面不为空不能确定的话,你直接where value = ? or value =?好了,或者value in ();;都可以,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
select * from A a ,B b where b.a_id = a.id and (select COUNT(*) from B bq where bq.value in ('b') and bq.a_id = a.id ) = 1 and (select COUNT(*) from B bq where bq.value not in ('b') and bq.a_id = a.id ) = 0
第一个子查询 里的 in 和第二个子查询里 not in 保留同样的关键字 第一处子查询那个1 填in里的个数 第二个写0的地方永远写0
第一个子查询 里的 in 和第二个子查询里 not in 保留同样的关键字 第一处子查询那个1 填in里的个数 第二个写0的地方永远写0
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看下面 一句搞定
select A.* from B left join A on B.a_id=A.id where B.value='a' or B.value='b'
select A.* from B left join A on B.a_id=A.id where B.value='a' or B.value='b'
更多追问追答
追问
我的问题关键难在,我要的不是A记录对应在B记录的value里面包含某些值,而是只能有这些值。
追答
是呀,有哪些值你就可以用or连接哪些值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询