получить конкретные строки таблицы с учетом правила SQL Server 2008 - PullRequest
1 голос
/ 18 августа 2011

У меня есть таблица типа:

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 , Может бытьwth dynamic 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)

Есть ли способ сделать это внутри кейса илипока цикл?

1 Ответ

2 голосов
/ 18 августа 2011

Это сработало в тестировании.

Вы можете просто выполнить внутреннее объединение на @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...