如何使用sql server 2008获取sub_of中的级别数?

时间:2017-02-20 08:01:22

标签: sql sql-server sql-server-2008

我有这样的表,

|id | Name   |sub_of|
|1  |Level 1A|  0   |
|2  |Level 1B|  0   |
|3  |Level 1C|  0   |
|4  |Level 1D|  0   |
|5  |Level 2A|  1   |
|6  |Level 2B|  2   |
|7  |Level 2C|  3   |
|8  |Level 3C|  7   |
|9  |Level 4C|  8   |
|10 |Level 5C|  9   |
|11 |Level 3B|  6   |

我是这个案例

  • A有2个级别
  • B有3个级别
  • c有5个级别
  • d有1个级别

Sub_of是上一级的id。名称不包含sub_of名称(即A不包含A的所有级别)。

我需要sub_of的最高级别。请提出一些想法。

2 个答案:

答案 0 :(得分:2)

Recursive cte是你的朋友......

创建并填充样本表(在将来的问题中保存此步骤)

DECLARE @T as TABLE
(
    id int,
    Name varchar(10), 
    sub_of int
)

INSERT INTO @T VALUES
(1  ,'Level 1A',0),
(2  ,'Level 1B',0),
(3  ,'Level 1C',0),
(4  ,'Level 1D',0),
(5  ,'Level 2A',1),
(6  ,'Level 2B',2),
(7  ,'Level 2C',3),
(8  ,'Level 3C',7),
(9  ,'Level 4C',8),
(10 ,'Level 5C',9),
(11 ,'Level 3B',6)

cte:

;WITH CTE AS
(
    SELECT id, Name, Sub_Of, 0 As Level
    FROM @T
    WHERE Sub_Of = 0

    UNION ALL
    SELECT t.id, t.Name, t.Sub_Of, Level + 1 
    FROM @T as t
    INNER JOIN CTE ON t.Sub_Of = CTE.id  
)

查询:

SELECT *
FROM CTE 
ORDER BY Level DESC

结果:

id  Name        Sub_Of  Level
10  Level 5C    9       4
9   Level 4C    8       3
11  Level 3B    6       2
8   Level 3C    7       2
7   Level 2C    3       1
6   Level 2B    2       1
5   Level 2A    1       1
1   Level 1A    0       0
2   Level 1B    0       0
3   Level 1C    0       0
4   Level 1D    0       0

答案 1 :(得分:1)

您需要为每个级别(A,B,C,...)

添加唯一标识符

使用递归cte查询我使用了第一个id,其中sub_of = 0作为唯一标识符:

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end

class ActionDispatch::IntegrationTest
  include Devise::Test::IntegrationHelpers
end

然后只需获得每组的MAX(等级)。

Failure:
Api::WelcomeControllerTest#test_index_renders_message [/Users/ahmadhamza/sites/manage_society/test/controllers/api/welcome_controller_test.rb:8]:
Expected response to be a <2XX: success>, but was a <401: Unauthorized>

在此处查看:http://rextester.com/KIEY97438