任务表
用户操作表
需求:
用户操作表:某一个用户(UserID)可以操作某一种型号的机器(机器重量是多少,机器型号多少)。一个用户可能会操作多种型号的机器。
任务表:某一个需求(编号),需要某一种型号的机器(机器重量是多少,机器型号多少),一个需求可能需要多种型号的机器。
现在要求某个用户可以操作任务表里面,某一个编号需要的所有型号的机器,譬如:
UserID=1的用户,会3种型号的机器,编号1001的任务需要这其中的2种型号的机器,UserID=1的用户就可以搞定编号1001的所有任务。
UserID=2的用户,只会1种型号的机器,编号1001的任务却需要2种型号的机器,UserID=2的用户就可以搞不定编号1001的所有任务。
UserID=3的用户,只会1种型号的机器,编号1003的任务需要这其中的1种型号的机器,UserID=3的用户就可以搞定编号1003的任务。
以上表希望得到的结果:
我分析了一下,你这个需求用sql实现起来有点困难,还是通过程序来实现吧
两个表根据重量和型号做inner join不行么?
不行,请仔细看看需求。
你应该定义一个机器表,标明:机器ID、重量、型号。然后,用户的能力与任务的需求是与机器ID相关,这样查起来会更好。
任务表:Task,各字段为:
SerialNo、weight、type
用户操作表:User_operation,各字段为:
UserID、weight、type
楼主想要的sql语句如下:
select
a.SerialNo as [订单编号],
a.UserID as [用户ID]
from
(
select SerialNo, UserID, count(*) counter from
(
select a.SerialNo, b.UserID from
Task a inner join User_operation b on a.type = b.type and a.weight = b.weight
)t
group by SerialNo, UserID
)a
inner join
(
select SerialNo, count(*) counter from Task group by SerialNo
)b
on a.SerialNo = b.SerialNo and a.counter = b.counter
借用下楼上的表
1 :select count(SerialNo) as countser,SerialNo from task
group by SerialNo 先求出每个任务都有几个几个要求
2:select count(SerialNo) as countser,SerialNo,userid from
(
select t.*,u.UserID from task t left join User_operation u
on t.type=u.type and t.weight=u.weight
where u.UserID is not null) t2
group by SerialNo,userid 再求出每个人都能做每个任务中几个要求
3上面两个关联下
select * from (
select count(SerialNo) as countser,SerialNo from task
group by SerialNo) a
,(
select count(SerialNo) as countser,SerialNo,userid from
(
select t.*,u.UserID from task t left join User_operation u
on t.type=u.type and t.weight=u.weight
where u.UserID is not null) t2
group by SerialNo,userid ) b
where a.countser=b.countser and a.SerialNo=b.SerialNo
创建任务表Temp1
CREATE TABLE [dbo].[Temp1](
[id] [nchar](10) NULL,
[weights] [int] NULL,
[typeid] [nchar](10) NULL
) ON [PRIMARY]
GO
创建用户操作表Temp2
CREATE TABLE [dbo].[Temp2](
[userId] [nchar](10) NULL,
[weights] [int] NULL,
[typeId] [nchar](10) NULL
) ON [PRIMARY]
GO
select distinct a.id as 订单编号,a.userId as 用户ID
from
(select Temp1.id,Temp2.userId ,
(select count(1) from Temp1 where Temp1.typeid =Temp2.typeId and Temp1.weights=Temp2.weights ) as T1
from Temp1 inner join Temp2 on Temp2.typeId=Temp1.typeid and Temp2.weights=Temp1.weights) a,
(select Temp1.id,Temp2.userId ,
(select count(1) from Temp2 where Temp2.typeId=Temp1.typeid and Temp2.weights=Temp1.weights ) as T2
from Temp1 inner join Temp2 on Temp2.typeId=Temp1.typeid and Temp2.weights=Temp1.weights) b
where a.id=b.id and a.userId=b.userId and a.T1=b.T2
select count(SerialNo) as countser,SerialNo from task
group by SerialNo