2013-11-08 6 views
0

У меня есть небольшая база данных доступа с некоторыми таблицами. Я пытаюсь использовать код в sql-дизайне в доступе. Я просто хочу случайным образом выбрать запись в таблице.Случайно выберите строку с SQL в Access

Я создал простую таблицу под названием StateAbbreviation. Он имеет две колонки: ID и Abbreviation. ID - это всего лишь автозапуск, а Abbreviation - это разные аббревиатуры для состояний.

я видел this нить здесь. Так что я попытался

SELECT Abbreviation 
FROM STATEABBREVIATION 
ORDER BY RAND() 
LIMIT 1; 

Я получаю ошибки Синтаксическая ошибка (отсутствующий оператор) в expresion запроса RAND() LIMIT 1. Поэтому я устал RANDOM() вместо RAND(). Такая же ошибка.

Ни один из остальных не работал. Что я делаю не так? Благодарю.

+0

"Малый доступ к базе данных"? Пожалуйста, отметьте свой вопрос соответственно –

+2

Если вы используете MS-Access, см. Это: http://stackoverflow.com/questions/9937222/how-to-get-random-record-from-ms-access-database –

ответ

0

Попробуйте это:

SELECT TOP 1 * 
FROM tbl_name 
ORDER BY NEWID() 

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

+0

У него будет " соображения производительности "в разделе Access SQL в каждом случае, в частности« Неопределенная функция NEWID »в выражении». –

+0

К сожалению, я не заметил слова «Доступ» в OP - я только что принял SQL Server. – timbck2

3

Ypercude при условии ссылки, которые привели меня к правильному ответу ниже:

SELECT TOP 1 ABBREVIATION 
FROM STATEABBREVIATION 
ORDER BY RND(ID); 

Обратите внимание, что для RND(), я считаю, что это должно быть целое значение/переменная.

+0

Примечание. Важно также указать целочисленное значение первичного ключа в качестве аргумента ('RND (ID)'), чтобы Access SQL генерировал другое случайное значение для каждой записи. (Если вы просто используете 'ORDER BY RND()', то оптимизатор запросов считает, что вызов функции является детерминированным и только оценивает его один раз.Поэтому вы получаете одно и то же «случайное» значение для всех строк.) –

0

Пожалуйста, попробуйте это, это полезно для вас

Это можно сделать с помощью хранимой процедуры и функции, которые я создал это есть дополнительный столбец, который вы могли бы быть создать в вашем имени таблицы FLAG и столбец все поля значение должно быть 0 Тогда он работает

create Procedure proc_randomprimarykeynumber 
as 
    declare @Primarykeyid int 

    select top 1 
     @Primarykeyid = u.ID 
    from 
     StateAbbreviation u 
    left join 
     StateAbbreviation v on u.ID = v.ID + 1 
    where 
     v.flag = 1 

    if(@Primarykeyid is null) 
    begin 
     UPDATE StateAbbreviation 
     SET flag = 0 

     UPDATE StateAbbreviation 
     SET flag = 1 
     WHERE ID IN (SELECT TOP 1 ID 
        FROM dbo.StateAbbreviation) 
    END 
    ELSE 
    BEGIN 
     UPDATE StateAbbreviation 
     SET flag = 0 

     UPDATE StateAbbreviation 
     SET flag = 1 
     WHERE ID IN (@Primarykeyid) 
    END 

    SET @Primarykeyid = 1 

    SELECT TOP 1 
     ID, Abbreviation 
    FROM 
     StateAbbreviation 
    WHERE 
     flag = 1 

это сделано в хранимой процедуре запуска этого и получить серийный мудрое первичный ключ

exec proc_randomprimarykeynumber 

Спасибо и внимание

1

Вы должны одновременно переменная и время засева, чтобы не получить ту же последовательность (ы) каждый раз, когда вы открываете доступ и выполнить запрос - и использовать Access SQL в Access:

SELECT TOP 1 Abbreviation 
FROM STATEABBREVIATION 
ORDER BY Rnd(-Timer()*[ID]); 

где ID - первичный ключ таблицы.

+1

И он работает так же, как и из Delphi через ADOQuery! –

Смежные вопросы