如何在SQL Server中生成易于排序的id?
我正在制作一个网站,生成父/子树时遇到问题,如:如何在SQL Server中生成易于排序的id?,sql,sql-server,sorting,identity,Sql,Sql Server,Sorting,Identity,我正在制作一个网站,生成父/子树时遇到问题,如: Page 1 ---Sub page 1 ------Sub page 1 - 1 Page 2 Page 3 ---Sub page 3 ------Sub page 3 - 1 ------Sub page 3 - 2 如果我使用UID,就不可能通过t-sql编写命令来生成树。我正在考虑一个可以生成ID varchar的函数,例如: 001000000 ---001001000 ------001001001 002000000 00300
Page 1
---Sub page 1
------Sub page 1 - 1
Page 2
Page 3
---Sub page 3
------Sub page 3 - 1
------Sub page 3 - 2
如果我使用UID,就不可能通过t-sql编写命令来生成树。我正在考虑一个可以生成ID varchar的函数,例如:
001000000
---001001000
------001001001
002000000
003000000
---003001000
------003001001
------003001002
我将跳过自定义Id并在数据库中存储父/子关系。然后使用递归查询来构建树。对于网页,使用URL很简单。托比的想法也没问题,但它可能比你需要的更复杂,尽管我实际上在做他在另一个应用程序中告诉你的事情,所以在正确的情况下,我不会反对它。你的计划也会起作用
但是,为什么您希望函数为您执行此操作?在一个简单的方案中,你可以很高兴地让AUTO_INCREMENT为你工作;但是在一个层次结构中,你需要决定事情的走向,没有函数可以为你做这件事。也许你可以将父id存储在表中,而不是尝试在表中这样做,只需返回行并使用递归来构建你的树,如下所示,以便在第一次运行后进行优化,您可以将制表符顺序和排序顺序存储在数据类中第一次递归运行时指定的属性中。这里有一个例子
class Program
{
static void Main(string[] args)
{
Program program = new Program();
List<Data> rows = new List<Data>();
program.CreateData(rows);
Console.WriteLine("Data ...");
program.ShowData(rows);
Console.WriteLine("");
Console.WriteLine("Data as tree ...");
program.ShowDataAsTree(rows);
Console.WriteLine("");
}
public void ShowData(List<Data> rows)
{
foreach (Data row in rows)
{
Data parent = rows.Find(item => item.Id == row.Parent);
Console.WriteLine(String.Format("Name = {0}, Parents Name = {1}", row.Text, parent == null ? "" : parent.Text));
}
}
public void ShowDataAsTree(List<Data> rows)
{
rows.Sort((item1, item2) => item1.Text.CompareTo(item2.Text));
ShowDataSortedWrk(rows, Guid.Empty, 0);
}
public void ShowDataSortedWrk(List<Data> rows, Guid parentId, int tab)
{
foreach (Data row in rows)
{
if (row.Parent == parentId)
{
for (int i = 0; i < tab; i++)
{
Console.Write("\t");
}
Console.WriteLine(row.Text);
ShowDataSortedWrk(rows, row.Id, tab + 1);
}
}
}
public void CreateData(List<Data> rows)
{
Data alice = new Data(Guid.Empty, "Alice");
rows.Add(alice);
Data eric = new Data(Guid.Empty, "Eric");
rows.Add(eric);
Data mike = new Data(alice.Id, "Mike");
rows.Add(mike);
rows.Add(new Data(mike.Id, "Mark"));
rows.Add(new Data(eric.Id, "Jane"));
rows.Add(new Data(alice.Id, "Emma"));
rows.Add(new Data(mike.Id, "Fred"));
rows.Add(new Data(alice.Id, "Perry"));
rows.Add(new Data(eric.Id, "Julie"));
rows.Add(new Data(eric.Id, "Paul"));
}
}
public class Data
{
public Data(Guid parent, string text)
{
this.Id = Guid.NewGuid();
this.Parent = parent;
this.Text = text;
}
public Guid Id
{
get;
set;
}
public Guid Parent
{
get;
set;
}
public String Text
{
get;
set;
}
}
查看嵌套集模型中的层次结构。Joe Celko还介绍了在SQL中建模树和层次结构的其他方法。使用嵌套集模型,您将有如下内容:
CREATE TABLE Tree_Nodes
(
lft INT NOT NULL,
rgt INT NOT NULL,
name VARCHAR(40) NOT NULL,
CONSTRAINT PK_Tree_Nodes PRIMARY KEY CLUSTERED (lft, rgt)
)
INSERT INTO Tree_Nodes (lft, rgt, name)
SELECT 1, 6, 'Page 1' UNION ALL
SELECT 2, 5, 'Sub page 1' UNION ALL
SELECT 3, 4, 'Sub page 1 - 1' UNION ALL
SELECT 7, 8, 'Page 2' UNION ALL
SELECT 9, 16, 'Page 3' UNION ALL
SELECT 10, 15, 'Sub page 3' UNION ALL
SELECT 11, 12, 'Sub page 3 - 1' UNION ALL
SELECT 13, 14, 'Sub page 3 - 2'
然后,为了得到你想要得到的结果,简单地说:
SELECT
lft,
rgt,
name
FROM
Tree_Nodes
ORDER BY
lft
什么版本的SQL Server?如果2008年内置了对层次结构的支持,这可能会有所帮助,我不确定这一点,因为我的服务器只支持SQL server 2005>>你是说你的托管帐户?@ByulTaeng谢谢,我搜索了很长时间!我明白你的意思,我也尝试过递归的方法,当然可以,但就速度而言,这不是最好的解决方案。嗯?我是这里唯一一个真正反对递归方式的人…?我的书架上有这本书-乔·塞尔科的智能SQL。我相信乔·塞尔科的智能SQL中的树和层次结构扩展了原书中的一章。