Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加自动增量的SQL递归方法_Sql_Sql Server_Recursion_Common Table Expression - Fatal编程技术网

添加自动增量的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

我是SQL初学者。我有一个问题,对我来说很棘手,而且故事很长

  • 第一个表是存储用户信息的用户表
  • 第二个表是存储用户事务的事务表
我试图实现的操作是,我将给“发布msg”和其各自推荐人的用户打分。对于每一位推荐人,他们的分数都会比前一位少

例如: --用户5>77>80

如果用户80获得5分,
用户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 |
+--------+----------+-------------+-------------+-----------+--------+