ms sql 2005 递归查询如何实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ms sql 2005 递归查询如何实现相关的知识,希望对你有一定的参考价值。

现有一数据库表如下
CREATE TABLE [dbo].[Co_ItemNameSet](
[ItemId] [int] NULL,
[ParentItemId] [int] NULL,
[ItemName] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
insert into dbo.Co_ItemNameSet values(2,0,'管理费用')
insert into dbo.Co_ItemNameSet values(3,0,'销售费用')
insert into dbo.Co_ItemNameSet values(4,0,'财务费用')
insert into dbo.Co_ItemNameSet values(5,0,'生产成本')
insert into dbo.Co_ItemNameSet values(35,5,'材料')
insert into dbo.Co_ItemNameSet values(36,5,'人工')
insert into dbo.Co_ItemNameSet values(37,5,'制造费用')
insert into dbo.Co_ItemNameSet values(38,35,'原材料')
insert into dbo.Co_ItemNameSet values(39,35,'主要材料')
insert into dbo.Co_ItemNameSet values(40,35,'间辅材料')
insert into dbo.Co_ItemNameSet values(41,36,'工资')
insert into dbo.Co_ItemNameSet values(42,36,'福利')
insert into dbo.Co_ItemNameSet values(43,2,'管理费用子项')
insert into dbo.Co_ItemNameSet values(113,43,'管理费用子项的子项')

select * from Co_ItemNameSet

查询ItemId=2及子节点,也就是管理费用和其下属所有节点的信息显示如下:
层次 科目名称
1 管理费用
1.1 管理费用子项
1.1.1 管理费用子项的子项

查询ItemId=5及子节点,也就是生产成本和其下属所有节点的信息显示如下:
层次 科目名称
1 生产成本
1.1 材料
1.1.1 原材料
1.1.2 主要材料
1.1.3 间辅材料
1.2 人工
1.2.1 工资
1.2.2 福利
1.3 制造费用

参考技术A select a.* from Co_ItemNameSet a,

(

select  ItemId  from Co_ItemNameSet d where ParentItemId =2 or ItemId =2

union all

select  ItemId  from Co_ItemNameSet d where ParentItemId in (select  ItemId  from Co_ItemNameSet d where ParentItemId =2)

union all

select  ItemId  from Co_ItemNameSet d where ParentItemId in (select  ItemId  from Co_ItemNameSet d where ParentItemId in (select  ItemId  from Co_ItemNameSet d where ParentItemId =2))

union all

select  ItemId  from Co_ItemNameSet d where ParentItemId in (select  ItemId  from Co_ItemNameSet d where ParentItemId in (select  ItemId  from Co_ItemNameSet d where ParentItemId in (select  ItemId  from Co_ItemNameSet d where ParentItemId =2)))) b

where a.ItemId =b.ItemId

追问

谢谢你的方法,但我要的层次号还是没显示出来。我要的是:
层次 科目名称
1 管理费用
1.1 管理费用子项
1.1.1 管理费用子项的子项
重点是如何正确显示层次号:
1
1.1
1.1.1

如何在查询中加入 MS-SQL 和 MySQL 表?

【中文标题】如何在查询中加入 MS-SQL 和 MySQL 表?【英文标题】:How can I join a MS-SQL and MySQL table in a query? 【发布时间】:2011-12-04 10:57:36 【问题描述】:

我想对 MS-SQL 和 MySql 数据库进行连接。

MS-SQL 查询有效地生成了一个索引,然后我想拉回与该查询结果匹配的所有 MySQL 记录。 (我可以带回两个表,即来自 MySQL 的未过滤数据,然后使用 Linq 进行过滤,但这将是低效的,因为我将拉回加载比我需要的更多的数据。)

MS-SQL 查询是通过 Linq 完成的:

var fb1 = from f in db.tl_feedbacks  
          where f.timestamp >= new DateTime(fromYear, fromMonth, fromDay)
             && f.timestamp <= new DateTime(toYear, toMonth, toDay)   
          select new f.requestID, f.tl_feedback_score.score ;

这将带回一个像这样的表格:

RequestID | score
-----------------
12345     | 1
12349     | 3
12446     | 3

等等

据此,我只想返回以下 MySQL 查询中在上表中具有 RequestID 的记录:

SELECT wo.WORKORDERID,
       COALESCE(ti.FIRST_NAME,'Not Assigned') AS 'Technician',
       COALESCE(cd.CATEGORYNAME, 'Not Assigned') AS Category,
       COALESCE(scd.NAME, 'Not Assigned') AS Subcategory,
       wof.UDF_CHAR1 "Office Location"  
FROM WorkOrder_Threaded wot  
INNER JOIN WorkOrder wo ON wot.WORKORDERID=wo.WORKORDERID  
LEFT JOIN SDUser sdu ON wo.REQUESTERID=sdu.USERID  
LEFT JOIN AaaUser aau ON sdu.USERID=aau.USER_ID  
LEFT JOIN WorkOrderStates wos ON wo.WORKORDERID=wos.WORKORDERID  
LEFT JOIN SDUser td ON wos.OWNERID=td.USERID  
LEFT JOIN AaaUser ti ON td.USERID=ti.USER_ID  
LEFT JOIN CategoryDefinition cd ON wos.CATEGORYID=cd.CATEGORYID  
LEFT JOIN SubCategoryDefinition scd ON wos.SUBCATEGORYID=scd.SUBCATEGORYID  
LEFT JOIN WorkOrder_Fields wof ON wo.WORKORDERID=wof.WORKORDERID  

即在这个例子中我只想拉回记录 12345、12349 和 12446。最终,我想要一张表,其中包含来自 MySQL 查询的 requestID、分数和列。但是,如果我可以取回“过滤”的 MySQL 表,我可以在之后加入这两个表。我只是不想让 MySQL 恢复“未过滤”,因为表会很大。

【问题讨论】:

【参考方案1】:

使用正确的 OLEDB 数据库驱动程序(我只使用 PGSQL 完成此操作,因此我无法给出真正的建议),您可以在 MSSQL 中创建 Linked Server。这是a walkthrough 和here's another。

然后您可以在 MSSQL 中使用OPENQUERY 查询它,如下所示:

select * from openquery(LinkedServerDb,'select * from remotetable')

并加入:

select 
    * 
from 
    openquery(LinkedServerDb,'select * from remotetable') remoteTable
    join localTable on remotetable.someid=localtable.otherid

【讨论】:

以上是关于ms sql 2005 递归查询如何实现的主要内容,如果未能解决你的问题,请参考以下文章

Sql ServerSQL SERVER 递归查询

在sql server中利用with as实现递归功能

如何在 MS Access 2007 中获取 sql 查询

如何在 MSSQL 2005 中创建递归查询?

如何在 MS Access 2007 或 MS SQL Server 2005 中通过 SQL 将字段转换为行

sql 递归查询