none
这样的查询如何实现? RRS feed

  • 问题

  • 数据库结构与数据
    ID----------Num
    56----------8
    65----------2
    66----------0
    68----------3
    70----------8
    88----------9
    89----------8
    90----------2
    92----------0
    93----------5
    
    比如用户输入三个数8、2、0。让这三个去数据库里面比对Num。先找8,找到8以后看下面是不是2,如果是再向下找是不是0.如果都满足了就返回数据。注意数据库里不一定只有一组8、2、0。只要满足都要返回。
    唉小弟现在不知道如何下手了,是使用游标吗? 
     
    • 已移动 BU XI - MSFT 2011年5月24日 2:10 (发件人:ASP.NET 与 AJAX)
    2011年5月22日 9:39

答案

  • 你好,

    根据你的描述,我通过公用表表达式和密集排名函数模拟了你的需求:

    USE tempdb;
    CREATE TABLE t1(id INT, num INT);
    
    INSERT INTO t1
    SELECT 56,8 UNION ALL
    SELECT 65,2 UNION ALL
    SELECT 66,0 UNION ALL
    SELECT 68,3 UNION ALL
    SELECT 70,8 UNION ALL
    SELECT 88,9 UNION ALL
    SELECT 89,8 UNION ALL
    SELECT 90,2 UNION ALL
    SELECT 92,0 UNION ALL
    SELECT 93,5;
    
    
    DECLARE @input1 INT,@input2 INT,@input3 INT;
    SELECT @input1=8, @input2=2, @input3=0;
    
    ;WITH cte AS
    (
     SELECT * FROM t1 WHERE num = @input1
      
     UNION ALL
     
     SELECT * FROM t1 WHERE num = @input2
     
      UNION ALL
      
      SELECT * FROM t1 WHERE num = @input3 
    )
    
    SELECT id,num FROM (
    SELECT *, DENSE_RANK() OVER(ORDER BY num) as rn FROM cte ) AS t2 WHERE rn=1;
    
    


    Best Regards,
    Stephanie Lv

    • 已标记为答案 hkstb 2011年5月25日 17:06
    2011年5月24日 2:47
  • 这个思路不该单用SQL去解决

    这个情况通常数据量很小,所以,把NUM串联起来,再把传入的参数串联,再Like or Charindex 均OK


    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    • 已标记为答案 hkstb 2011年5月25日 17:06
    2011年5月24日 7:54
  • 你好,

    >>对,这是个方法,先将NUM串成"8,2,0,3,8,9,8,2,0,5"一维数组。再用嵌套循环进行比较。不过4、5千的数据,一维数组能放下吗?

    如果你需要一次传入所有的数据,如"8,2,0,3,8,9,8,2,0,5",我认为你应该先对它进行分组,把分组后的记录放入一个表格中,然后再把每组对应的结果输出。

    Best Regards,
    Stephanie Lv

    • 已标记为答案 hkstb 2011年5月25日 17:06
    2011年5月25日 1:29

全部回复

  • 需要使用循环或游标
    知识改变命运,奋斗成就人生!
    2011年5月23日 6:27
  • 有没有思路给说一下呀。感觉光游标也不行呀,再加上循环好像还是不太好办。郁闷呀。

    2011年5月23日 6:56
  • 你好,

    根据你的描述,我通过公用表表达式和密集排名函数模拟了你的需求:

    USE tempdb;
    CREATE TABLE t1(id INT, num INT);
    
    INSERT INTO t1
    SELECT 56,8 UNION ALL
    SELECT 65,2 UNION ALL
    SELECT 66,0 UNION ALL
    SELECT 68,3 UNION ALL
    SELECT 70,8 UNION ALL
    SELECT 88,9 UNION ALL
    SELECT 89,8 UNION ALL
    SELECT 90,2 UNION ALL
    SELECT 92,0 UNION ALL
    SELECT 93,5;
    
    
    DECLARE @input1 INT,@input2 INT,@input3 INT;
    SELECT @input1=8, @input2=2, @input3=0;
    
    ;WITH cte AS
    (
     SELECT * FROM t1 WHERE num = @input1
      
     UNION ALL
     
     SELECT * FROM t1 WHERE num = @input2
     
      UNION ALL
      
      SELECT * FROM t1 WHERE num = @input3 
    )
    
    SELECT id,num FROM (
    SELECT *, DENSE_RANK() OVER(ORDER BY num) as rn FROM cte ) AS t2 WHERE rn=1;
    
    


    Best Regards,
    Stephanie Lv

    • 已标记为答案 hkstb 2011年5月25日 17:06
    2011年5月24日 2:47
  • 好像是这个意思,先谢谢了,我再细细研究一下。
    2011年5月24日 6:50
  • 这个思路不该单用SQL去解决

    这个情况通常数据量很小,所以,把NUM串联起来,再把传入的参数串联,再Like or Charindex 均OK


    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    • 已标记为答案 hkstb 2011年5月25日 17:06
    2011年5月24日 7:54
  • 对,这是个方法,先将NUM串成"8,2,0,3,8,9,8,2,0,5"一维数组。再用嵌套循环进行比较。不过4、5千的数据,一维数组能放下吗?
    2011年5月24日 14:33
  • 你好,

    >>对,这是个方法,先将NUM串成"8,2,0,3,8,9,8,2,0,5"一维数组。再用嵌套循环进行比较。不过4、5千的数据,一维数组能放下吗?

    如果你需要一次传入所有的数据,如"8,2,0,3,8,9,8,2,0,5",我认为你应该先对它进行分组,把分组后的记录放入一个表格中,然后再把每组对应的结果输出。

    Best Regards,
    Stephanie Lv

    • 已标记为答案 hkstb 2011年5月25日 17:06
    2011年5月25日 1:29