添加自动增量的SQL递归方法
我是SQL初学者。我有一个问题,对我来说很棘手,而且故事很长添加自动增量的SQL递归方法,sql,sql-server,recursion,common-table-expression,Sql,Sql Server,Recursion,Common Table Expression,我是SQL初学者。我有一个问题,对我来说很棘手,而且故事很长 第一个表是存储用户信息的用户表 第二个表是存储用户事务的事务表 我试图实现的操作是,我将给“发布msg”和其各自推荐人的用户打分。对于每一位推荐人,他们的分数都会比前一位少 例如: --用户5>77>80 如果用户80获得5分, 用户77将获得4分和 用户5将获得3分 我做了我想要的结果的递归输出,但我不能让人知道推荐人与他们的孩子有关联 create table nl_loyalruledet ( loyalprogid
- 第一个表是存储用户信息的用户表
- 第二个表是存储用户事务的事务表
用户77将获得4分和
用户5将获得3分 我做了我想要的结果的递归输出,但我不能让人知道推荐人与他们的孩子有关联
create table nl_loyalruledet
(
loyalprogid varchar(20) not null,
loyalruleid varchar(20) not null,
rulelevel int not null,
methodtype char(1) not null,
flat float not null default 0
)
分配给每个层级的推荐人和直接人员的分数由另一个表维护。该表具有loyalprogid、loyalruleid和rulelevel键,用于知道为推荐人分配哪些分数以获得其子女获得的分数
create table nl_loyalruledet
(
loyalprogid varchar(20) not null,
loyalruleid varchar(20) not null,
rulelevel int not null,
methodtype char(1) not null,
flat float not null default 0
)
我的问题是:
;WITH parents
AS (
SELECT u.userid
,u.referrer
,lt.loyalprogid
,lt.loyalruleid
,cast(1 AS INT) AS rulelevel
FROM nl_loyaltrans lt
LEFT JOIN nl_users u ON lt.userid = u.userid
UNION ALL
SELECT c.userid
,c.referrer
,CAST(loyalprogid AS VARCHAR(20))
,CAST(loyalruleid AS VARCHAR(20))
,cast((
row_number() OVER (
ORDER BY c.userid
) + 1
) AS INT) AS rulelevel
FROM nl_users c
INNER JOIN parents p ON p.referrer = c.userid -- this is the recursion
)
SELECT *
FROM parents
所需的输出-->
事实上,我可以通过加入nl_忠诚规则组获得分数
我无法获得正确的规则级别,因为我认为它是递归方法。请尝试下面的方法。。我已使用dateran列进行订购 由于复杂性,我在nl_loyaltrans中又插入了一条记录
insert into nl_loyaltrans
values ('2017052300004', 77, GETDATE(), 'SOCINVEST', 'POSTMSG', 'E', 'Earned Points', 6)
现在点击下面的查询
;WITH parents
AS (
SELECT u.userid
,u.referrer
,lt.loyalprogid
,lt.loyalruleid
,cast(1 AS INT) AS rulelevel
,lt.datetran
,LT.points
FROM nl_loyaltrans lt
LEFT JOIN nl_users u ON lt.userid = u.userid
UNION ALL
SELECT c.userid
,c.referrer
,CAST(loyalprogid AS VARCHAR(20))
,CAST(loyalruleid AS VARCHAR(20))
, P.rulelevel +1
,P.datetran
,p.points-1
FROM nl_users c
INNER JOIN parents p ON p.referrer = c.userid -- this is the recursion
)
SELECT userid,referrer,loyalprogid,loyalruleid,rulelevel,points
FROM parents
ORDER BY datetran , rulelevel
结果:
+--------+----------+-------------+-------------+-----------+--------+
| userid | referrer | loyalprogid | loyalruleid | rulelevel | points |
+--------+----------+-------------+-------------+-----------+--------+
| 79 | 0 | SOCINVEST | POSTMSG | 1 | 5 |
| 80 | 77 | SOCINVEST | POSTMSG | 1 | 5 |
| 77 | 5 | SOCINVEST | POSTMSG | 2 | 4 |
| 5 | 0 | SOCINVEST | POSTMSG | 3 | 3 |
| 77 | 5 | SOCINVEST | POSTMSG | 1 | 6 |
| 5 | 0 | SOCINVEST | POSTMSG | 2 | 5 |
+--------+----------+-------------+-------------+-----------+--------+
请仅标记您正在使用的DBMS
mysql
不支持CTEs,因此它很可能是sql server
。但没有任何假设。请使用特定的标签。p.rulelevel+1拯救我的屁股。。。。谢谢…天哪…你怎么会是cte专家?那是你可以学习cte的网站吗?我发现并没有多少网站像那个些教授SQL的网站那样教授cte。
+--------+----------+-------------+-------------+-----------+--------+
| userid | referrer | loyalprogid | loyalruleid | rulelevel | points |
+--------+----------+-------------+-------------+-----------+--------+
| 79 | 0 | SOCINVEST | POSTMSG | 1 | 5 |
| 80 | 77 | SOCINVEST | POSTMSG | 1 | 5 |
| 77 | 5 | SOCINVEST | POSTMSG | 2 | 4 |
| 5 | 0 | SOCINVEST | POSTMSG | 3 | 3 |
| 77 | 5 | SOCINVEST | POSTMSG | 1 | 6 |
| 5 | 0 | SOCINVEST | POSTMSG | 2 | 5 |
+--------+----------+-------------+-------------+-----------+--------+