首页 新闻 会员 周边

求一条SQL语句

1
悬赏园豆:50 [已解决问题] 解决于 2015-07-05 00:34

如图,有这么张表,里面有这样的数据。

UserName是NULL的时候就是默认的Bonus对应Limit配置,如果UserName不为空而且有Bonus的值覆盖了默认值

现在就要查出 UserName='lay'的数据,结果应该如下

上图结果去除Bonus=7.9 and UserName = null的情况剩下的就是应得结果

问题补充:

需求是明确的,我也知道表达的不清楚,但是不知道怎么才能表达清楚。

这个表是用户设置表,每个用户对应多条设置项,Bonus是返点,Limit是限制数量,意思就是某个返点(Bonus)限制多少个(Limit),UserName是外键,但是可以为空,如果为空就是缺省的几条设置,意思是:如果没有给某个用户设置就使用缺省的,所以查出的数据就应该为:查询条件为UserName,结果是对应的返点设置。

不知道这样说表达清楚了吗?

carl~的主页 carl~ | 初学一级 | 园豆:84
提问于:2015-07-04 15:26
< >
分享
最佳答案
0

估计需求是明确的,但是没有表达清楚。建议写完问题自己读一遍。

收获园豆:49
liqipeng | 小虾三级 |园豆:1160 | 2015-07-04 19:34

需求是明确的,我也知道表达的不清楚,但是不知道怎么才能表达清楚。

这个表是用户设置表,每个用户对应多条设置项,Bonus是返点,Limit是限制数量,意思就是某个返点(Bonus)限制多少个(Limit),UserName是外键,但是可以为空,如果为空就是缺省的几条设置,意思是:如果没有给某个用户设置就使用缺省的,所以查出的数据就应该为:查询条件为UserName,结果是对应的返点设置。

不知道这样说表达清楚了吗?

carl~ | 园豆:84 (初学一级) | 2015-07-04 19:45

@carl~:

应该理解了。

假设这个表名为T_Bonus

DECLARE @CurrentUserName VARCHAR(MAX) = 'lay'
SELECT * FROM T_Bonus WHERE UserName=@CurrentUserName
UNION ALL
SELECT A.* FROM T_Bonus AS A JOIN T_Bonus AS B ON A.UserName=null AND B.UserName=@CurrentUserName AND A.Bonus<>A.Bonus

试试。

liqipeng | 园豆:1160 (小虾三级) | 2015-07-04 20:49

@liqipeng: 不行~~只能查出UserName='lay'的结果,没有包含默认的(UserName=null)

carl~ | 园豆:84 (初学一级) | 2015-07-05 00:05

@carl~: 

又犯低级错误了,改为IS NULL

DECLARE @CurrentUserName VARCHAR(MAX) = 'lay'
SELECT * FROM T_Bonus WHERE UserName=@CurrentUserName
UNION ALL
SELECT A.* FROM T_Bonus AS A JOIN T_Bonus AS B ON A.UserName IS NULL AND B.UserName=@CurrentUserName AND A.Bonus<>A.Bonus
liqipeng | 园豆:1160 (小虾三级) | 2015-07-05 00:29

@liqipeng: 

DECLARE @CurrentUserName VARCHAR(MAX) = 'lay'
SELECT * FROM NewUserRule WHERE UserName=@CurrentUserName
UNION ALL
SELECT A.* FROM NewUserRule AS A JOIN NewUserRule AS B ON A.UserName IS NULL AND B.UserName=@CurrentUserName AND A.Bonus<>B.Bonus

 

这样就对了,谢谢你

carl~ | 园豆:84 (初学一级) | 2015-07-05 00:34

@carl~: 呵呵,太多低级错误了

liqipeng | 园豆:1160 (小虾三级) | 2015-07-05 00:36

@liqipeng: 大哥又发现了问题,我解决不了,麻烦再帮忙看下吧

问题: 比如要查询UserName='123'的数据时,如果表中没有UserName='123'的项的时候,那查出来的数据就是空 的

carl~ | 园豆:84 (初学一级) | 2015-07-07 10:55

@carl~: 

后一句改成: SELECT A.* FROM NewUserRule AS A WHERE A.UserName IS NULL AND NOT EXISTS(SELECT B.Bonus FROM NewUserRule AS B WHERE B.UserName=@CurrentUserName AND A.Bonus=B.Bonus)

liqipeng | 园豆:1160 (小虾三级) | 2015-07-07 14:13
其他回答(2)
0

需求不明确,建议写清楚点 

收获园豆:1
晓道 | 园豆:297 (菜鸟二级) | 2015-07-04 15:48

需求是明确的,我也知道表达的不清楚,但是不知道怎么才能表达清楚。

这个表是用户设置表,每个用户对应多条设置项,Bonus是返点,Limit是限制数量,意思就是某个返点(Bonus)限制多少个(Limit),UserName是外键,但是可以为空,如果为空就是缺省的几条设置,意思是:如果没有给某个用户设置就使用缺省的,所以查出的数据就应该为:查询条件为UserName,结果是对应的返点设置。

不知道这样说表达清楚了吗?

支持(0) 反对(0) carl~ | 园豆:84 (初学一级) | 2015-07-04 19:45
0
DECLARE @UserName VARCHAR(100)
SET @UserName = '123'

SELECT TOP 1 * FROM(
    SELECT * FROM [T_Bonus] TB
    WHERE TB.UserName = @UserName AND TB.Bonus IS NOT NULL
    UNION ALL
    SELECT * FROM [T_Bonus] TB
    WHERE TB.UserName IS NULL AND TB.Bonus IS NOT NULL
)TB

代码是给人看的,逻辑要清晰,这么简单的事情(如果我正确的理解了题主的意图的话),被你们搞的逻辑复杂。。。

TO题主,你写完回复后都没有自己念念是否表意通顺?

~洛书~ | 园豆:333 (菜鸟二级) | 2015-07-07 22:14

执行后结果不对,实际上下面这样结果是符合我预期的.

我也知道我表达的不清楚,只是不知道如何才能表达清楚。。。

DECLARE @UserName VARCHAR(100)
SET @UserName = '123'

SELECT * FROM    NewUserRule WHERE    UserName = @UserName
UNION
SELECT * FROM    NewUserRule    WHERE    UserName IS NULL    
    AND Bonus NOT IN (        
        SELECT
            Bonus
        FROM
            NewUserRule
        WHERE
            UserName = @UserName
    )

 

支持(0) 反对(0) carl~ | 园豆:84 (初学一级) | 2015-07-08 08:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册