sqlserverwith遞歸查詢
Ⅰ sql 查詢出到上一級(無限級)
這個用with 語句可以實現,sqlserver應該支持
參考:
http://hi..com/micro0369/item/5a89cc277733081e0975086c
這個是從上網下搜索的。
Ⅱ sqlserver 遞歸查詢
CREATE TABLE #tb1(stuId INT,stuName VARCHAR(30),teaId INT);
INSERT INTO #tb1 (stuId,stuName,teaId)
VALUES(1,'zhou',0),(2,'kong',0),(3,'hong',2),(4,'zhang',1),(5,'liu',4),
(6,'zhao',5),(7,'zheng',6),(8,'wei',7)
;WITH cte AS (
SELECT t.stuId,t.stuName,t.teaId FROM #tb1 AS t
WHERE t.stuId=8
UNION ALL
SELECT t.stuId,t.stuName,t.teaId FROM cte AS c
JOIN #tb1 AS t ON c.teaId=t.stuId
)
SELECT * FROM cte
Ⅲ sqlserver 中 有connect prior by 這個方法,怎麼使用的啊請舉例說明。
沒有,用with語法
1. 用with查詢,實現遞歸,大致如下:
withsubqry(inpro,pro,quantity)as(
selectinpro,pro,quantity
fromtest1wherepro='A'
unionall
selecttest1.inpro,test1.pro,test.quantity*subqry.quantityquantity
fromtest1,subqry
wheretest1.pro=subqry.inpro
)
select*fromsubqry;
Ⅳ SQL中使用WITH 語句的查詢
sql
with
as
用法(適用sqlserver,好像oracle也適用)
Server
2005中提供了公用表表達式(CTE),使用CTE,可以使SQL語句的可維護性,同時,CTE要比表變數的效率高得多。
下面是CTE的語法:
[
WITH
<common_table_expression>
[
,n
]
]
<
common_table_expression>::=
expression_name
[
(
column_name
[
,n
]
)
]
AS
(
CTE_query_definition
)
現在使用CTE來解決上面的問題,SQL語句如下:
with
cr
as
(
select
CountryRegionCode
from
person.CountryRegion
where
Name
like
'C%'
)
select
*
from
person.StateProvince
where
CountryRegionCode
in
(select
*
from
cr)
其中cr是一個公用表表達式,該表達式在使用上與表變數類似,只是SQL
Server
2005在處理公用表表達式的方式上有所不同。
在使用CTE時應注意如下幾點:
1.
CTE後面必須直接跟使用CTE的SQL語句(如select、insert、update等),否則,CTE將失效。如下面的SQL語句將無法正常使用CTE:
with
cr
as
(
select
CountryRegionCode
from
person.CountryRegion
where
Name
like
'C%'
)
select
*
from
person.CountryRegion
--
應將這條SQL語句去掉
--
使用CTE的SQL語句應緊跟在相關的CTE後面
--
select
*
from
person.StateProvince
where
CountryRegionCode
in
(select
*
from
cr)
2.
CTE後面也可以跟其他的CTE,但只能使用一個with,多個CTE中間用逗號(,)分隔,如下面的SQL語句所示:
with
cte1
as
(
select
*
from
table1
where
name
like
'abc%'
),
cte2
as
(
select
*
from
table2
where
id
>
20
),
cte3
as
(
select
*
from
table3
where
price
<
100
)
select
a.*
from
cte1
a,
cte2
b,
cte3
c
where
a.id
=
b.id
and
a.id
=
c.id
3.
如果CTE的表達式名稱與某個數據表或視圖重名,則緊跟在該CTE後面的SQL語句使用的仍然是CTE,當然,後面的SQL語句使用的就是數據表或視圖了,如下面的SQL語句所示:
--
table1是一個實際存在的表
with
table1
as
(
select
*
from
persons
where
age
<
30
)
select
*
from
table1
--
使用了名為table1的公共表表達式
select
*
from
table1
--
使用了名為table1的數據表
4.
CTE
可以引用自身,也可以引用在同一
WITH
子句中預先定義的
CTE。不允許前向引用。
5.
不能在
CTE_query_definition
中使用以下子句:
(1)COMPUTE
或
COMPUTE
BY
(2)ORDER
BY(除非指定了
TOP
子句)
(3)INTO
(4)帶有查詢提示的
OPTION
子句
(5)FOR
XML
(6)FOR
BROWSE
6.
如果將
CTE
用在屬於批處理的一部分的語句中,那麼在它之前的語句必須以分號結尾,如下面的SQL所示:
declare
@s
nvarchar(3)
set
@s
=
'C%'
;
--
必須加分號
with
t_tree
as
(
select
CountryRegionCode
from
person.CountryRegion
where
Name
like
@s
)
select
*
from
person.StateProvince
where
CountryRegionCode
in
(select
*
from
t_tree)
7、CTE除了可以簡化嵌套SQL語句外,還可以進行遞歸調用
Ⅳ 誰可以給個sqlserver2005兩張表之間的遞歸查詢,我看網上都是一張表兩個欄位之間遞歸查詢.
with
district as
(
select * from SECFUNMODULE where MENUID='030'
union all
select a.* from SECFUNMODULE a, district b
where a.PMENUID = b.MENUID
),
district1 as
(
select a.* from district a where a.MENUID in (select PMENUID from district)
)
select * from district1 order by MENUID
with當然可以實現.
請參照sqlserver2005 的遞歸查詢
http://blog.csdn.net/chenghaibing2008/article/details/8501322
Ⅵ sqlserver查詢樹形結構的所有子節點
sqlserver查詢樹形結構的所有子節點
用標准sql的with實現遞歸查詢(sql2005以上肯定支持,sql2000不清楚是否支持):
with subqry(id,name,pid) as (
select id,name,pid from test1 where id = 5
union all
select test1.id,test1.name,test1.pid from test1,subqry
where test1.pid = subqry.id
)
select * from subqry;
Ⅶ SQL遞歸查詢知多少
1、基本概念
公用表表達式 (CTE) 可以認為是在單個 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 語句的執行范圍內定義的臨時結果集。公用表表達式可以包括對自身的引用,這種表達式稱為遞歸公用表表達式。
創建遞歸查詢。有關詳細信息,請參閱使用公用表表達式的遞歸查詢。
在不需要常規使用視圖時替換視圖,也就是說,不必將定義存儲在元數據中。
啟用按從標量嵌套 select 語句派生的列進行分組,或者按不確定性函數或有外部訪問的函數進行分組。
在同一語句中多次引用生成的表。
MSDN上對CTE的介紹
T-SQL查詢進階--詳解公用表表達式(CTE)
CTE 的基本語法結構如下:
WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
--只有在查詢定義中為所有結果列都提供了不同的名稱時,列名稱列表才是可選的。
--運行 CTE 的語句為:
SELECT <column_list> FROM expression_name;
即三個部分:
公用表表達式的名字(在WITH關鍵字之後)
查詢的列名(可選)
緊跟AS之後的SELECT語句(如果AS之後有多個對公用表的查詢,則只有第一個查詢有效)
Ⅷ 關於sqlserver遞歸查詢
你的意思沒特別看懂,但是在ORACLE裡面的遞歸語法是:
select * from tab ...start with ... connect by col_parent...
你可以查一下start with ,connect 的語法
Ⅸ 資料庫語句的遞歸查詢求助
應該是這樣:
with qry as (select user_id,parent_id from tab where user_id = 32
union all
select tab.user_id,tab.parent_id from tab,qry
where tab.parent_id = qry.id)
select * from qry ;
我用mysql5.0.22,不支持上述語法,oracle就可以(sqlserver應該也可以):
create table tab1(user_id int, parent_id int);
insert into tab1 values(1,null);
insert into tab1 values(32,1);
insert into tab1 values(101,32);
insert into tab1 values(102,32);
insert into tab1 values(201,101);
insert into tab1 values(202,101);
insert into tab1 values(203,102);
insert into tab1 values(204,102);
select * from tab1;
with qry(user_id,parent_id) as (select user_id,parent_id from tab1 where user_id = 32
union all
select tab1.user_id,tab1.parent_id from tab1,qry
where tab1.parent_id = qry.user_id
)
select * from qry;
所以,mysql沒有辦法了,只有寫函數,用循環來實現了。
Ⅹ sqlserver 向上遞歸 向下遞歸我知道了,但是如何向上遞歸難
寫在SQL里吧,可以避免頻繁的創建連接,那是開銷很大的.
不過可能寫在sql里比較煩吧.