我有这样的表,
|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 |
我是这个案例
Sub_of是上一级的id。名称不包含sub_of名称(即A不包含A的所有级别)。
我需要sub_of的最高级别。请提出一些想法。
答案 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>