如图,有这么张表,里面有这样的数据。
UserName是NULL的时候就是默认的Bonus对应Limit配置,如果UserName不为空而且有Bonus的值覆盖了默认值
现在就要查出 UserName='lay'的数据,结果应该如下
上图结果去除Bonus=7.9 and UserName = null的情况剩下的就是应得结果
需求是明确的,我也知道表达的不清楚,但是不知道怎么才能表达清楚。
这个表是用户设置表,每个用户对应多条设置项,Bonus是返点,Limit是限制数量,意思就是某个返点(Bonus)限制多少个(Limit),UserName是外键,但是可以为空,如果为空就是缺省的几条设置,意思是:如果没有给某个用户设置就使用缺省的,所以查出的数据就应该为:查询条件为UserName,结果是对应的返点设置。
不知道这样说表达清楚了吗?
估计需求是明确的,但是没有表达清楚。建议写完问题自己读一遍。
需求是明确的,我也知道表达的不清楚,但是不知道怎么才能表达清楚。
这个表是用户设置表,每个用户对应多条设置项,Bonus是返点,Limit是限制数量,意思就是某个返点(Bonus)限制多少个(Limit),UserName是外键,但是可以为空,如果为空就是缺省的几条设置,意思是:如果没有给某个用户设置就使用缺省的,所以查出的数据就应该为:查询条件为UserName,结果是对应的返点设置。
不知道这样说表达清楚了吗?
@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: 不行~~只能查出UserName='lay'的结果,没有包含默认的(UserName=null)
@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:
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~: 呵呵,太多低级错误了
@liqipeng: 大哥又发现了问题,我解决不了,麻烦再帮忙看下吧
问题: 比如要查询UserName='123'的数据时,如果表中没有UserName='123'的项的时候,那查出来的数据就是空 的
@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)
需求不明确,建议写清楚点
需求是明确的,我也知道表达的不清楚,但是不知道怎么才能表达清楚。
这个表是用户设置表,每个用户对应多条设置项,Bonus是返点,Limit是限制数量,意思就是某个返点(Bonus)限制多少个(Limit),UserName是外键,但是可以为空,如果为空就是缺省的几条设置,意思是:如果没有给某个用户设置就使用缺省的,所以查出的数据就应该为:查询条件为UserName,结果是对应的返点设置。
不知道这样说表达清楚了吗?
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题主,你写完回复后都没有自己念念是否表意通顺?
执行后结果不对,实际上下面这样结果是符合我预期的.
我也知道我表达的不清楚,只是不知道如何才能表达清楚。。。
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 )