在给定规则SQL Server 2008的情况下获取特定的表行

时间:2011-08-18 18:27:53

标签: sql sql-server sql-server-2008 sql-server-2008-r2 dynamic-sql

我有一张表:

ID   NAME     VAL
----------------------
1   a1*a1   90052
2   a1*a2   236
3   a1*a3   56
4   a1*a4   6072
5   a1*a5   1004
6   a2*a2   4576
7   a2*a3   724
8   a2*a4   230
9   a2*a5   679
10  a3*a3   5
11  a3*a4   644
12  a3*a5   23423
13  a4*a4   42354
14  a4*a5   10199
15  a5*a5   10279

给定S = 5的数字,我想查询 行的编号为:1,6,10,13,15 他们是a1*a1,a2*a2,a3*a3,a4*a4 and a5*a5

我想要像:

INSERT #NEW_TABLE (ID,NAME,Value) (
SELECT ordinal, NAME, VAL FROM myTable where id = 1,6,10,13,15)

获取

  ID   NAME     VAL
    ----------------------
    1   a1*a1   90052
    2   a2*a2   4576
    3   a3*a3   5
    4   a4*a4   42354
    5   a5*a5   10279

有没有办法为任何给定的S 执行此操作,也许是动态的SQL?

我得到了公式,我得到了这个:

S = 5

ID     formula
1      1
6      1+S
10     1+S+ (S-1)
13     1+S+ (S-1) + (S-2)
15     1+S+ (S-1) + (S-2) + (S-3)

有没有办法在case或while循环中执行此操作?

1 个答案:

答案 0 :(得分:2)

这在测试中起作用。

您可以通过@Tab进行内部加入以限制结果。您可能还想为低于3的值添加一些陷阱,我还没有这样做。

基本流程是

  • 声明你的@s值
  • 插入前两行,因为它们将始终相同
  • 在循环中,一次插入一行并增加差异
  • 循环退出@s-2
  • 后退出

尝试:

DECLARE @Tab Table (id INT)

DECLARE @S int = 5,
        @ct int

DECLARE @cur int = (1 + @S)

INSERT INTO @Tab SELECT 1
INSERT INTO @Tab SELECT (1 + @S)

SET @ct = 1

WHILE @ct <= @S - 2
BEGIN

    SET @cur = @cur + (@S - @ct)

    INSERT INTO @Tab SELECT @cur

    SET @ct = @ct + 1

END

SELECT * FROM @Tab
ORDER BY id

要在查询中使用此功能,您可以执行以下任一操作:

SELECT ordinal, NAME, VAL 
FROM myTable 
WHERE id IN (SELECT id FROM @Tab)

-- OR

SELECT ordinal, NAME, VAL 
FROM myTable t
INNER JOIN @tab t2
    ON t2.id = t.id