日期:2014-05-16  浏览次数:20867 次

求3个怪异的SQL
----------------------问题1----------------------------
有两个表   Info   和   Msg

Info
-------
ID         Name
1           张三
2           李四
3           王麻子


Msg
-------
UserID     Text
1               文字内容
2               我顶你个肺
1               你太有才了
3               遭了
2               男女关系


要完成的目标是用户给出Info表中Name,比如“李四”,然后取得“李四”的ID,再到Msg表中统计UsrID为李四ID的记录的数目,如果小于10就取出李是的ID
现在是用两次查询完成的

SELECT   ID   FROM   Info   WHERE   Name=“李四”
SELECT   UserID   FROM   Msg   WHERE   (SELECT   COUNT(*)   FROM   Msg   WHERE   UserID=李四ID) <10

我想请问能不能在一句SQL中完成这些操作,Access的IF()函数有用吗?
如果不能在一句里完成,请告诉我最简单的语句,谢谢


------------------问题2-----------------------------------
有表Info

Info
---------
ID   Point
1     1000
2     2000
3     1500
4     8000

Point是用户的点数,用户可以把自己的点数转给别人,比如用户A要转500点给用户B,现在是用两次查询完成的

UPDATE   Info   SET   Point=Point-500   WHERE   ID=A
UPDATE   Info   SET   Point=Point+500   WHERE   ID=B

我想请问能不能在一句SQL中完成这些操作?如果不能在一句里完成,请告诉我最简单的语句,谢谢


------------------问题3-----------------------------------
有表Info   和   Exam

Info
---------
ID   Point
1     1000
2     2000
3     1500
4     8000

Exam
---------
Text
我QQ你个XX
停车场
玉米面

用户要取出Exam中的一条记录,前提是要扣掉自己的500点数,如果点数不够500就离开,现在是这样做的

SELECT   Point   FROM   Info   WHERE   ID=用户ID

if   gRs( "Point ")> 500   then
UPDATE   Info   SET   Point=Point-500   WHERE   ID=用户ID
SELECT   Text   FROM   Text   WHERE   ID=文章ID
end   if

我想请问能不能在一句SQL中完成这些操作?用户Point不够500就返回空,如果够500就扣除500然后返回ID=文章ID的文章内容,如果不能在一句里完成,请告诉我最简单的语句,谢谢


在线等,谢谢大家



------解决方案--------------------
不复杂:
select UserID,count(*) as gs from msg group by UserID having count(*) <10
将COUNT(*)<10的记录选择出来,按USERID分组

select * from Info a inner join (
select UserID,count(*) as gs from msg group by UserID having count(*) <10) b
on a.ID=b.UserID where a.Name= '李四 '
用INFO表与上述结果连接,条件是a.ID=b.UserID ,并且Name= '李四 '

比起T-SQL,jet sql应该更简单。