首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

一个简单的sql语句有关问题

2012-09-02 
一个简单的sql语句问题有一表 如下idpiduid111212313421523624731835需求如下查询出所有与uid有项目关系的

一个简单的sql语句问题
有一表 如下

id pid uid
1 1 1
2 1 2
3 1 3
4 2 1
5 2 3
6 2 4
7 3 1
8 3 5

需求如下
查询出所有与uid有项目关系的uid,就是说pid是连接uid的一个关键

比如说 与uid = 1 相关的有 1 2 3 4 5 

不知这样说还清楚?
最好是效率比较高些的查询语句。 谢谢 !

 

[解决办法]

SQL code
select * from table1 where [uid]=@uid union allselect * from table1 where [pid]=@uid
[解决办法]
SQL code
USE tempdbGO-- 建立演示环境CREATE TABLE Dept( id int PRIMARY KEY,  parent_id int, name nvarchar(20))INSERT DeptSELECT 0, 0, N'<全部>' UNION ALLSELECT 1, 0, N'财务部' UNION ALLSELECT 2, 0, N'行政部' UNION ALLSELECT 3, 0, N'业务部' UNION ALLSELECT 4, 0, N'业务部' UNION ALLSELECT 5, 4, N'销售部' UNION ALLSELECT 6, 4, N'MIS' UNION ALLSELECT 7, 6, N'UI' UNION ALLSELECT 8, 6, N'软件开发' UNION ALLSELECT 9, 8, N'内部开发'GO-- 查询指定部门下面的所有部门DECLARE @Dept_name nvarchar(20)SET @Dept_name = N'MIS';WITHDEPTS AS( -- 定位点成员 SELECT * FROM Dept WHERE name = @Dept_name UNION ALL -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归 SELECT A.* FROM Dept A, DEPTS B WHERE A.parent_id = B.id)SELECT * FROM DEPTSGO-- 删除演示环境DROP TABLE Dept----CTE的综合应用USE tempdbGO-- 建立演示环境CREATE TABLE Dept( id int PRIMARY KEY,  parent_id int, name nvarchar(20))INSERT DeptSELECT 0, 0, N'<全部>' UNION ALLSELECT 1, 0, N'财务部' UNION ALLSELECT 2, 0, N'行政部' UNION ALLSELECT 3, 0, N'业务部' UNION ALLSELECT 4, 0, N'业务部' UNION ALLSELECT 5, 4, N'销售部' UNION ALLSELECT 6, 4, N'MIS' UNION ALLSELECT 7, 6, N'UI' UNION ALLSELECT 8, 6, N'软件开发' UNION ALLSELECT 9, 8, N'内部开发'GO-- 查询指定部门下面的所有部门, 并汇总各部门的下级部门数DECLARE @Dept_name nvarchar(20)SET @Dept_name = N'MIS';WITHDEPTS AS(   -- 查询指定部门及其下的所有子部门 -- 定位点成员 SELECT * FROM Dept WHERE name = @Dept_name UNION ALL -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归 SELECT A.* FROM Dept A, DEPTS B WHERE A.parent_id = B.id),DEPTCHILD AS(  -- 引用第1个CTE,查询其每条记录对应的部门下的所有子部门 SELECT   Dept_id = P.id, C.id, C.parent_id FROM DEPTS P, Dept C WHERE P.id = C.parent_id UNION ALL SELECT   P.Dept_id, C.id, C.parent_id FROM DEPTCHILD P, Dept C WHERE P.id = C.parent_id),DEPTCHILDCNT AS( -- 引用第2个CTE, 汇总得到各部门下的子部门数 SELECT   Dept_id, Cnt = COUNT(*) FROM DEPTCHILD GROUP BY Dept_id)SELECT    -- JOIN第1,3个CTE,得到最终的查询结果 D.*, ChildDeptCount = ISNULL(DS.Cnt, 0)FROM DEPTS D LEFT JOIN DEPTCHILDCNT DS  ON D.id = DS.Dept_idGO-- 删除演示环境DROP TABLE Dept本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2009/09/19/4569529.aspx那就参考着自己写一下了,一个简单的递归就好了
[解决办法]
SQL code
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([id] INT,[pid] INT,[uid] INT)INSERT [tb]SELECT 1,1,1 UNION ALLSELECT 2,1,2 UNION ALLSELECT 3,1,3 UNION ALLSELECT 4,2,1 UNION ALLSELECT 5,2,3 UNION ALLSELECT 6,2,4 UNION ALLSELECT 7,3,1 UNION ALLSELECT 8,3,5--------------开始查询--------------------------SELECT DISTINCT a.[uid] FROM [tb] a,(    SELECT * FROM [tb] WHERE [uid]=1)  b WHERE a.[pid]=b.[pid]
[解决办法]
SQL code
IF OBJECT_ID('tb') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([id] INT,[pid] INT,[uid] INT)INSERT INTO [tb]SELECT 1,1,1 UNION ALLSELECT 2,1,2 UNION ALLSELECT 3,1,3 UNION ALLSELECT 4,2,1 UNION ALLSELECT 5,2,3 UNION ALLSELECT 6,2,4 UNION ALLSELECT 7,3,1 UNION ALLSELECT 8,3,5--SELECT  *  FROM  tbSELECT DISTINCT a.[uid] FROM [tb] a,( SELECT * FROM [tb] WHERE [uid]=1)b  WHERE a.[pid]=b.[pid]--drop table tb 

热点排行