Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 перейти к строке таблицы по номеру  [new]
LanaRix
Member

Откуда:
Сообщений: 5
У меня есть таблица в базе, я собираюсь пройти по всем строчкам, и для каждой выполнить определенный набор действий. проблема возникает в том, что мне нужно обратиться к строке по ее номеру:
set @count = (SELECT COUNT(*) FROM AUDITORIUM);
while @i<=@count
begin
	if ((Select AUDITORIUM.LOCATION_ID from AUDITORIUM where ROW_NUMBER() =@i) is not null)
...


в строке условия ROW_NUMBER() =@i выдает ошибку. Как тут написать правильно?
1 июл 19, 22:09    [21918559]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
londinium
Member

Откуда: Киев
Сообщений: 1139
Похоже на курсор
Примерно так:
use master
GO

IF OBJECT_ID(N'tempdb..#TEST',N'U')IS NOT NULL
  DROP TABLE tempdb..#TEST;
CREATE TABLE #TEST
(
  ID TINYINT NOT NULL,
  VALUE VARCHAR(5)NOT NULL
)  
INSERT #TEST(ID,VALUE)
 VALUES(1,'A'),(2,'B'),(3,'C'),(4,'D');

DECLARE @InID TINYINT;
DECLARE @InValue VARCHAR(5);

SET @InID=0;
SET @InValue='';

DECLARE cCursor CURSOR LOCAL FAST_FORWARD FOR
 SELECT ID,VALUE FROM #TEST;
OPEN cCursor;
FETCH NEXT FROM cCursor INTO @InId,@InValue;
WHILE @@FETCH_STATUS=0
 BEGIN
  --здесь обработка записей. для примера просто PRINT
  PRINT 'ID= '+CAST(@InID AS VARCHAR(1));

  --конец обработки
  SET @InID=0;
  SET @InValue='';
  FETCH NEXT FROM cCursor INTO @InId,@InValue;
 END
CLOSE cCursor;
DEALLOCATE cCursor; 
   
 
DROP TABLE #TEST; 
1 июл 19, 22:23    [21918565]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
LanaRix,

У записи нет номера, но может быть ключ, по которому и надо обращаться.
1 июл 19, 23:36    [21918606]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
LanaRix
У меня есть таблица в базе, я собираюсь пройти по всем строчкам, и для каждой выполнить определенный набор действий.
Отвыкайте от курсорно-алгоритмической логики мышления. Переходите на декларативную...
2 июл 19, 05:05    [21918652]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
LanaRix
Member

Откуда:
Сообщений: 5
Щукина Анна, я не против, только как это сделать? мне нужно в задании посчитать сумму всех значений столбца, у которых указано определенное значение другого столбца. но этот второй столбец в другой таблице, а между таблицами связь по внешнему ключу. вот и прохожу по циклу, в котором из одной таблицы беру id внешнего ключа и проверяю, что там в другой таблице. тут только по всем строкам проходить, другого варианта нет (по крайней мере сама не нашла ничего подходящего)
2 июл 19, 11:12    [21918814]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
LanaRix
Member

Откуда:
Сообщений: 5
londinium,
только тут черт ногу переломит, я это видела, потому и спросила, что ничего не понятно.
2 июл 19, 11:14    [21918817]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
LanaRix
Member

Откуда:
Сообщений: 5
Гавриленко Сергей Алексеевич, я не знаю, какие именно ключи брать. мне и нужно узнать в цикле, какие записи проходят, а какие нет. а по id листать смысла нет, они могут и не в порядке возрастания идти, и с пропусками (1, 2, 4...)
2 июл 19, 11:15    [21918822]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
LanaRix
Щукина Анна, я не против, только как это сделать? мне нужно в задании посчитать сумму всех значений столбца, у которых указано определенное значение другого столбца. но этот второй столбец в другой таблице, а между таблицами связь по внешнему ключу. вот и прохожу по циклу, в котором из одной таблицы беру id внешнего ключа и проверяю, что там в другой таблице. тут только по всем строкам проходить, другого варианта нет (по крайней мере сама не нашла ничего подходящего)


вы не своими словами объясняйте, что делать хотите, а саму задачу сюда пишите и все скрипты участвующих таблиц и их наполнерие и желаемый результат
2 июл 19, 11:17    [21918824]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
LanaRix
Гавриленко Сергей Алексеевич, я не знаю, какие именно ключи брать
Те, которые однозначно идентифицируют запись.
2 июл 19, 11:17    [21918826]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Соединять в запросе первую таблицу и подзапрос, в котором агрегация по полям для поиска в другой
2 июл 19, 11:24    [21918836]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Yuri Abele
Соединять в запросе первую таблицу и подзапрос, в котором агрегация по полям для поиска в другой


SELECT
    FirstTable.*,
    SubQueryToSecondTable.*
FROM
    FirstTable T1
    LEFT OUTER JOIN (
        SELECT ID, CNT=COUNT(*)
        FROM SecondTable
        GROUP BY KeyField
    ) T2 ON T1.T2_ID = T2.ID
2 июл 19, 11:28    [21918840]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Упс!
SELECT
    FirstTable.*,
    SubQueryToSecondTable.*
FROM
    FirstTable T1
    LEFT OUTER JOIN (
        SELECT ID, CNT=COUNT(*)
        FROM SecondTable
        GROUP BY ID
    ) T2 ON T1.T2_ID = T2.ID
[/quote]
2 июл 19, 11:28    [21918841]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30821
LanaRix
мне нужно в задании посчитать сумму всех значений столбца, у которых указано определенное значение другого столбца. но этот второй столбец в другой таблице, а между таблицами связь по внешнему ключу. вот и прохожу по циклу, в котором из одной таблицы беру id внешнего ключа и проверяю, что там в другой таблице. тут только по всем строкам проходить, другого варианта нет (по крайней мере сама не нашла ничего подходящего)
Нужно использовать оператор JOIN - связь таблиц друг с другом, в запросе.

Например:
select t1.столбец, sum(t2.значение)
from [одна таблица] as t1
    join [другая таблица] as t2 on t2.[внешний ключ] = t1.id
group by t1.столбец

LanaRix
они могут и не в порядке возрастания идти, и с пропусками (1, 2, 4...)
Записи в базе навалены кучей на диске, нету там никакого порядка, это не таблички в эквеле.

Таблицы в базе данных - это "множества", а язык SQL - язык, задающий операции над множествами - пересечение, объединение, и так далее, и выдающий готовый результат, без всяких "листаний страниц", которых в базах тоже нету, как и "порядка"
2 июл 19, 11:32    [21918848]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
LanaRix
Member

Откуда:
Сообщений: 5
londinium,
в принципе, если в документации посидеть подольше, то можно разобраться
2 июл 19, 11:40    [21918857]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2375
LanaRix
londinium,
в принципе, если в документации посидеть подольше, то можно разобраться

зачем? тут на форуме куча бездельников, выложат все на блюдечке
2 июл 19, 13:08    [21918939]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
LanaRix
londinium,
в принципе, если в документации посидеть подольше, то можно разобраться


почитайте про ROW_NUMBER() и не только в документации

эта функция нумерации выборки - сначала делается выборка from ... where, а потом результат нумеруется.
соответственно вы не можете использовать эту функцию как условие where.
ищите другой подход для вашей задачи
2 июл 19, 17:58    [21919324]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
LanaRix
мне нужно посчитать сумму всех значений столбца, у которых указано определенное значение другого столбца. но этот второй столбец в другой таблице
читать про SUM (бонусом и за GROUP BY почитайте), JOIN, WHERE. "Чистый" SQL, чистая декларация. Никаких алгоритмов и циклов...
2 июл 19, 19:36    [21919411]     Ответить | Цитировать Сообщить модератору
 Re: перейти к строке таблицы по номеру  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
LanaRix
мне нужно посчитать сумму всех значений столбца, у которых указано определенное значение другого столбца. но этот второй столбец в другой таблице
как вариант - JOIN заменить на IN/EXISTS-подзапрос. Но про них тоже придется почитать...
2 июл 19, 19:37    [21919412]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить