1

我有一个表,如:得到表的特定行给出一个规则的SQL Server 2008

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 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) 

有没有办法做到这一点的情况下,或在while循环?

+2

哪个RDBMS您使用的? –

+0

SQL Server 2008 R2 – cMinor

+0

在这一切中,“S”代表什么? –

回答

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 
+0

内部连接将如何看起来像? – cMinor

+0

我会添加一个笔记。 – JNK

相关问题