【问题标题】:get specific rows of table given a rule SQL Server 2008在给定规则 SQL Server 2008 的情况下获取表的特定行
【发布时间】:2011-08-18 18:27:52
【问题描述】:

我有一张这样的桌子:

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)

有没有办法在 case 或 while 循环中做到这一点?

【问题讨论】:

  • S 在这一切中代表什么?
  • S 是一个数字,表示不同 att 的数量,在示例中,当S=5 时,我们有a1,a2,a3,a4 and a5.

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


【解决方案1】:

这在测试中有效。

您可以在@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

【讨论】:

  • 内部连接是什么样子的?
猜你喜欢
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 2011-05-05
相关资源
最近更新 更多