我是SQL的初学者。我正在研究如何使用ms sql r2 2008管理分层数据。这是我提到的链接 http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 但现在我遇到了找到节点深度的问题 我将sql查询复制到我的ms sql
SELECT CONCAT( REPEAT(' ', COUNT(parent.name) - 1), node.name) AS name
FROM nested_category AS node, nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;
它回报我
Msg 195,Level 15,State 10,Line 1'REPEAT'不是公认的内置函数名。
有人可以帮我纠正sql查询吗? 另外,任何人都有更好的管理分层数据的解决方案吗?
答案 0 :(得分:2)
您使用MS SQL Server上的MySQL文章中的代码。
很多人会很好地翻译,但很多人都不会。正如@FilipDeVos所说,SQL Server中REPEAT()
的等效值为REPLICATE()
,你会发现更多像这样的情况。
当您找到它们时,您需要在线搜索与您正在使用的MySQL语句等效的SQL Server。
对于管理层次结构的不同方法,最常见的可能是adjaceny-lists,然后是你在该文章中使用的嵌套集。这取决于你的需求,继续研究,没有普遍的回答。
修改强>
如果你继续阅读那篇文章,并在这里询问每一个差异,你将永远在这里。您需要在网上搜索您的答案;)
但是,就目前而言,在您添加有关CONCAT()
的问题后,请尝试此操作...
SELECT REPLICATE(' ', COUNT(parent.name) - 1) + node.name AS name
答案 1 :(得分:1)
我认为REPEAT是一个mysql命令,你已经标记了MSSSQL,所以这可能不起作用。
对于Sql Server 2008中的分层数据,请查看HierarchyId数据类型。我已经添加了一些MSDN文章的链接,这些文章应该指向正确的方向。
答案 2 :(得分:1)
SQL Server的语法与mysql不同。查询可以按如下方式重写
SELECT REPLICATE(' ', COUNT(parent.name) - 1) + node.name AS name
FROM nested_category AS node
JOIN nested_category AS parent
ON node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;
REPEAT()
函数可以替换为SQL Server中的REPLICATE()
函数。CONCAT()
函数在SQL Server中没有对应函数,但字符串连接可以通过使用+
操作数来完成。INNER JOIN
构造可以更好地编写SQL Server中的连接,因为它更具表现力(尽管使用逗号的方法确实可以正常工作)。