Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取给定SQL Server 2008规则的表的特定行_Sql_Sql Server_Sql Server 2008_Sql Server 2008 R2_Dynamic Sql - Fatal编程技术网

获取给定SQL Server 2008规则的表的特定行

获取给定SQL Server 2008规则的表的特定行,sql,sql-server,sql-server-2008,sql-server-2008-r2,dynamic-sql,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 1

我有一张像这样的桌子:

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的数字,我想查询 id为1,6,10,13,15的行 它们是
a1*a1、a2*a2、a3*a3、a4*a4和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
是否有一种方法可以为任何给定的执行此操作,可能是使用动态sql

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

S=5


在一个案例或while循环中是否有这样做的方法?

这在测试中很有效

您只需在
@Tab
上进行内部联接即可限制结果。您可能还想为低于3的值添加一些陷阱,我还没有这样做

基本过程是

  • 声明您的@s值
  • 插入前两行,因为它们始终相同
  • 在循环中,每次插入一行,差异递增
  • 循环运行
    @s-2次后退出
尝试:


S
在所有这些中代表什么?S是一个数字,它告诉不同的att的数量,在示例中,当
S=5
时,我们有
a1、a2、a3、a4和a5。
内部连接看起来如何?
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)
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