有三张表
会员注册信息表
会员注册信息表 Users |
|||
字段 |
类型 |
为空 |
备注 |
UserId |
String |
否 |
会员id |
Passoword |
String |
否 |
密码 |
…… |
|
|
|
|
|
|
|
数据
UserId |
Passoword |
Zhangsan |
123456 |
Lisi |
123456 |
Wangwu |
123456 |
…… |
|
|
|
业务信息表
业务信息表 BusienssInfo |
|||
字段 |
类型 |
为空 |
备注 |
ID |
Int |
否 |
业务id |
BusinessName |
String |
否 |
业务名称 |
…… |
|
|
|
|
|
|
|
数据
ID |
BusinessName |
1 |
支付宝支付 |
2 |
财富通支付 |
3 |
中国银行支付 |
…… |
|
会员开通业务信息关系表
会员开通业务信息关系表 BusinessRelation |
|||
字段 |
类型 |
为空 |
备注 |
ID |
Int |
否 |
编号 |
UserId |
String |
否 |
会员id |
BusinessId |
Int |
否 |
业务id |
…… |
|
|
|
|
|
|
|
数据
ID |
UserId |
BusinessId |
1 |
Zhangsan |
1 |
2 |
Zhangsan |
2 |
3 |
Zhangsan |
3 |
4 |
Lisi |
1 |
5 |
Lisi |
2 |
6 |
Wangwu |
1 |
…… |
|
|
|
|
|
我现在想实现的功能是
例:
businessId为3的
zhangsan 已开通
Lisi 未开通
Wangwu 未开通
根据业务id查询已开通和未开通的会员,进行全部显示(备注:如果BusinessRelation表里有相关会员userid就代表已经开通),该怎么写sql语句?
好难!
SELECT B.bussinessName, b.UserId, CASE isnull(a.bussinessName, '') WHEN '' THEN '未开通' ELSE '已开通' END AS status FROM ( SELECT BusienssInfo.id, Users.UserId, BusienssInfo.bussinessName FROM BusienssInfo CROSS JOIN Users ) b left OUTER JOIN ( SELECT BusinessRelation.BusinessId as id, BusinessRelation.UserId, BusienssInfo.bussinessName FROM BusienssInfo inner JOIN BusinessRelation on BusienssInfo.ID = BusinessRelation.BusinessId ) a on a.ID = b.ID and a.UserId = b.UserId where b.ID=2
这个是执行结果
@笨笨蜗牛: 非常感谢。cross join听还没听说过呢。是得好好加加油了。。
@猪头猪脑:
当两个表之间没有join条件(做全正交的时候),也可以不写cross join,直接两个表然后逗号间隔就可以。
@笨笨蜗牛: 嗯。好。我会试下的。谢谢您
select Users.* from Users where Users.UserId in(select BusinessRelation.UserId from BusinessRelation where BusinessRelation.BusinessId in(select BusienssInfo.ID from BusienssInfo where BusienssInfo.ID=1))
SELECT C.ID,C.BusinessName,C.UserID,[开通/未开通]=Case When Isnull(D.UserID,'')='' Then N'未开通' Else N'开通' End
FROM (
SELECT A.ID,A.BusinessName,B.UserID
From dbo.BusienssInfo a
Cross Join dbo.Users b
) C
LEFT JOIN dbo.BusinessRelation D ON C.UserID =D.UserID AND C.ID =D.BusinessId
楼上速度好快
@Shannon:
你的比我的简洁,少用了一个select。
非常感谢