在每个id有多行时应用where where条件(单表或Join多个)

时间:2015-11-27 18:40:41

标签: mysql sql tsql

我在mysql / SQL Server

中有以下要求
Table Name: basic(pid int,av int,sid int,st int,wid int,wt int)

对于每个pid,将有10行(包含sid,st值和wid,每个pid的wt值)。这些集合可以是1到10。

因此,对于pid值(例如:3213和3214),将有10行,如下所示

enter image description here

如上所述,可能有数百万条记录

我想要实现的是,我想获得其(sid = 2且各自的st> = 7)并且其(wid = 9且各自的wt> = 6)

的pid

如果我应用这个条件,我应该得到pid的列表,它必须有两个pid的3213和3214.

如何使用简单的SQL查询实现此目的,或者我可以将表格分为三个,如basic1(pid,av),basic_sk(pid,sid,st)和basic_wc(pid,wid,wt)

因为我可以使用pid作为参考,我可以加入..即使我尝试使用连接,也无法达到所需的结果。

我在下面使用了加入 -

select t1.pid from basic1 t2
inner join basic_sk t2 on t1.pid=t2.pid
inner join basic_wc t3 on t3.pid=t2.pid
where (((t2.sid=2) and (t2.st>=7)) and ((t3.wid=9) and (t3.wt>=6)))

但没有运气。 如果我在条件和wid和wt值中有多个sid和st值怎么样? 比如in {sid = 2,st> = 7}和{sid = 4,st> = 9} 和{wid = 9,wt> = 6}和{wid = 5,wt> = 5}

如何使用简单的SQL查询来实现我的要求?

任何可能性对我来说都很好,有一张桌子或多张桌子(使用连接)

1 个答案:

答案 0 :(得分:1)

一种方法是使用aggregation和having子句;

select b.pid
from basic b
group by p.pid
having sum(case when (b.sid = 2) and (b.st >= 7) then 1 else 0 end) > 0 and
       sum(case when (b.wid = 9) and (b.wt >= 6) then 1 else 0 end) > 0;

having子句中的每个条件都会计算与每个条件匹配的行。 > 0确保每个行至少有一行。