有一表 如下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 不知这样说还清楚?
最好是效率比较高些的查询语句。 谢谢 !       

解决方案 »

  1.   

    select * from table1 where [uid]=@uid union all
    select * from table1 where [pid]=@uid
      

  2.   


    USE tempdb
    GO-- 建立演示环境
    CREATE TABLE Dept(
     id int PRIMARY KEY, 
     parent_id int,
     name nvarchar(20))
    INSERT Dept
    SELECT 0, 0, N'<全部>' UNION ALL
    SELECT 1, 0, N'财务部' UNION ALL
    SELECT 2, 0, N'行政部' UNION ALL
    SELECT 3, 0, N'业务部' UNION ALL
    SELECT 4, 0, N'业务部' UNION ALL
    SELECT 5, 4, N'销售部' UNION ALL
    SELECT 6, 4, N'MIS' UNION ALL
    SELECT 7, 6, N'UI' UNION ALL
    SELECT 8, 6, N'软件开发' UNION ALL
    SELECT 9, 8, N'内部开发'
    GO-- 查询指定部门下面的所有部门
    DECLARE @Dept_name nvarchar(20)
    SET @Dept_name = N'MIS'
    ;WITH
    DEPTS 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 DEPTS
    GO-- 删除演示环境
    DROP TABLE Dept----CTE的综合应用USE tempdb
    GO-- 建立演示环境
    CREATE TABLE Dept(
     id int PRIMARY KEY, 
     parent_id int,
     name nvarchar(20))
    INSERT Dept
    SELECT 0, 0, N'<全部>' UNION ALL
    SELECT 1, 0, N'财务部' UNION ALL
    SELECT 2, 0, N'行政部' UNION ALL
    SELECT 3, 0, N'业务部' UNION ALL
    SELECT 4, 0, N'业务部' UNION ALL
    SELECT 5, 4, N'销售部' UNION ALL
    SELECT 6, 4, N'MIS' UNION ALL
    SELECT 7, 6, N'UI' UNION ALL
    SELECT 8, 6, N'软件开发' UNION ALL
    SELECT 9, 8, N'内部开发'
    GO-- 查询指定部门下面的所有部门, 并汇总各部门的下级部门数
    DECLARE @Dept_name nvarchar(20)
    SET @Dept_name = N'MIS'
    ;WITH
    DEPTS 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_id
    GO-- 删除演示环境
    DROP TABLE Dept本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2009/09/19/4569529.aspx
    那就参考着自己写一下了,一个简单的递归就好了
      

  3.   

    --> 测试数据:[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 ALL
    SELECT 2,1,2 UNION ALL
    SELECT 3,1,3 UNION ALL
    SELECT 4,2,1 UNION ALL
    SELECT 5,2,3 UNION ALL
    SELECT 6,2,4 UNION ALL
    SELECT 7,3,1 UNION ALL
    SELECT 8,3,5
    --------------开始查询--------------------------SELECT DISTINCT a.[uid] FROM [tb] a,
    (
    SELECT * FROM [tb] WHERE [uid]=1
    )  b 
    WHERE a.[pid]=b.[pid]是这个样子吗
      

  4.   


    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 ALL
    SELECT 2,1,2 UNION ALL
    SELECT 3,1,3 UNION ALL
    SELECT 4,2,1 UNION ALL
    SELECT 5,2,3 UNION ALL
    SELECT 6,2,4 UNION ALL
    SELECT 7,3,1 UNION ALL
    SELECT 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