高手请进,求一条复杂的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
展开
 我来答
good_007_2000
2013-11-29 · TA获得超过223个赞
知道答主
回答量:144
采纳率:0%
帮助的人:117万
展开全部

需求转换

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)
百度网友60ba0a5
2013-11-29 · TA获得超过231个赞
知道小有建树答主
回答量:544
采纳率:100%
帮助的人:210万
展开全部
你的问题很简单,看来你基础不怎么好,不要喷我,告诉你答案。

解决方法就是左连接
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 ();;都可以,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
杨筱硕
2013-11-29 · 超过29用户采纳过TA的回答
知道答主
回答量:177
采纳率:0%
帮助的人:98.1万
展开全部
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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lifengsen123
2013-11-29 · 超过17用户采纳过TA的回答
知道答主
回答量:117
采纳率:0%
帮助的人:55.5万
展开全部
看下面 一句搞定
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连接哪些值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
977657205
2013-11-29 · TA获得超过452个赞
知道小有建树答主
回答量:332
采纳率:100%
帮助的人:221万
展开全部

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式