Нумерация строк в представлении - PullRequest
0 голосов
/ 11 августа 2011

Я подключаюсь к базе данных SQL с помощью ПЛК, и мне нужно вернуть список значений.К сожалению, ПЛК имеет ограниченную память и может извлекать только приблизительно 5000 значений одновременно, однако база данных может содержать до 10000 значений.

Как таковой, мне нужен способ получения этих значений за 2 операции.К сожалению, ПЛК ограничен в запросе, который он может выполнять, и ограничен только командами SELECT и WHERE, поэтому я не могу использовать LIMIT или TOP или что-нибудь подобное.

Есть ли способ, которым я могу создатьвид, а автоматический номер каждого поля в этом представлении?Затем я мог бы запросить все записи <5000, а затем второй запрос <10000 и т. Д. </p>

К сожалению, похоже, что представления не поддерживают столбец идентификаторов, поэтому это нужно будет сделать вручную.

Кто-нибудь есть предложения?Похоже, что на данный момент единственно реалистичным вариантом для меня является создание двух представлений: одно с первыми 5000 и одно со следующими 5000 ...

Я использую SQL Server 2000, если это имеет значение ...

Ответы [ 3 ]

0 голосов
/ 12 августа 2011

В то время как код, предоставленный Дереком, выполняет то, что я просил - то есть нумерует каждую строку в представлении, производительность для этого действительно низкая - приблизительно 20 секунд до 100 строк.Как таковое, это не осуществимое решение.Альтернативой является нумерация первых 5000 записей с 1, а следующих 5000 с 2. Это можно сделать с помощью 3 простых запросов и выполнить намного быстрее.

Код для этогоследует:

SELECT TOP(5000) BCode, SAPCode, 1 as GroupNo FROM dbo.DB 
UNION
SELECT TOP (10000) BCode, SAPCode, 2 as GroupNo FROM dbo.DB p 
WHERE ID NOT IN (SELECT TOP(5000) ID FROM dbo.DB)

Хотя, как указал Андрей М., вам также следует указать явную сортировку, чтобы гарантировать, что вы не пропустите ни одной записи.

0 голосов
/ 12 августа 2011

Одной из возможностей может быть использование функции с временной таблицей, такой как

CREATE FUNCTION dbo.OrderedBCodeData()
RETURNS @Data TABLE (RowNumber int IDENTITY(1,1),BCode int,SAPCode int)
AS 
BEGIN
    INSERT INTO @Data (BCode,SAPCode)
    SELECT BCode,SAPCode FROM dbo.DB ORDER BY BCode

    RETURN
END

И выберите из этой функции, например,

SELECT FROM dbo.OrderedBCodeData() WHERE RowNumber BETWEEN 5000 AND 10000

Я никогда не использовал это в производстве, на самом деле сегодня утром это была просто быстрая идея, но ее стоит изучить как более аккуратную альтернативу?

0 голосов
/ 11 августа 2011

Есть 2 решения. Самый простой - изменить таблицу SQL и добавить столбец IDENTITY. Если это невозможно, вам нужно будет сделать что-то вроде запроса ниже. Для 10000 строк это не должно быть слишком медленным. Но по мере роста стола он будет становиться все хуже и хуже.

SELECT        Col1, Col2, (SELECT COUNT(i.Col1) 
               FROM yourtable i 
               WHERE i.Col1 <= o.Col1) AS RowID
FROM          yourtable o
...