2013-04-25 5 views
2

У меня есть следующий запрос:Выберите только некоторые строки из базы данных

string Query = String.Format("SELECT ArticleName FROM tblArticles WHERE UserID={0} ORDER BY PostDate DESC", UserID); 

Я хочу, чтобы получить не более 3 различных значения для «ArticleName».
Можно ли это сделать? (без выбора всего «ArticleName» только 3 из них?)

Спасибо.

+0

Какие базы данных? Существуют также решения для конкретных баз данных. – Kangkan

+0

Я использую «База данных Microsoft Access (.mdb)» –

ответ

2

Обычно вы можете использовать LIMIT 3 в конце запроса, чтобы достичь этого

string Query = String.Format(
    "SELECT ArticleName FROM tblArticleas WHERE UserID={0} ORDER BY PostDate DESC LIMIT 3", 
    UserID 
); 

Или для Microsoft Access БД, видимо, вам нужно использовать TOP 3 в начале вместо этого, например:

string Query = String.Format(
    "SELECT TOP 3 ArticleName FROM tblArticleas WHERE UserID={0} ORDER BY PostDate DESC", 
    UserID 
); 
+0

спасибо, но .. Я не работаю ... –

+0

@NaveTseva see edit – Anentropic

+0

Спасибо. Теперь он отлично работает! –

2

Вы должны сказать, какие СУБД вы используете. Mysql и sqlite поддерживают директиву LIMIT, тогда как другие системы могут поддерживать или не поддерживать TOP, FIRST или другие подобные директивы.

ОБНОВЛЕНИЕ. Посмотрите, как это поддерживаются различными системами РСУБД. См. Метод getLoadSomeRowsSql() в файле infinispan's TableManipulation.java.

Здесь, в случае, если ссылка перестает работать:

switch (getDatabaseType()) { 
    case ORACLE: 
     loadSomeRowsSql = String.format("SELECT %s, %s FROM (SELECT %s, %s FROM %s) WHERE ROWNUM <= ?", dataColumnName, idColumnName, dataColumnName, idColumnName, getTableName()); 
     break; 
    case DB2: 
    case DB2_390: 
    case DERBY: 
     loadSomeRowsSql = String.format("SELECT %s, %s FROM %s FETCH FIRST ? ROWS ONLY", dataColumnName, idColumnName, getTableName()); 
     break; 
    case INFORMIX: 
    case INTERBASE: 
    case FIREBIRD: 
     loadSomeRowsSql = String.format("SELECT FIRST ? %s, %s FROM %s", dataColumnName, idColumnName, getTableName()); 
     break; 
    case SQL_SERVER: 
     loadSomeRowsSql = String.format("SELECT TOP (?) %s, %s FROM %s", dataColumnName, idColumnName, getTableName()); 
     break; 
    case ACCESS: 
    case HSQL: 
    case SYBASE: 
     loadSomeRowsSql = String.format("SELECT TOP ? %s, %s FROM %s", dataColumnName, idColumnName, getTableName()); 
     break; 
    default: 
     // the MySQL-style LIMIT clause (works for PostgreSQL too) 
     loadSomeRowsSql = String.format("SELECT %s, %s FROM %s LIMIT ?", dataColumnName, idColumnName, getTableName()); 
     break; 
} 
1

Может быть

SELECT DISTINCT TOP 3 ArticleName, PostDate FROM tblArticleas WHERE UserID={0} ORDER BY PostDate DESC 
+0

У меня появилось сообщение о том, что следующая строка не работает, потому что DISTINCT и ORDER BY находятся в конфликте. –

+0

Да, извините. Добавление PostDate в список столбцов, которые вы выбираете, устраняет конфликт. Это приемлемо? –

+0

Если это не так, быстро обходным путем является написать ArticleName, PostDate в таблице temp, затем выбрать столбец из этой таблицы temp –

1

Используйте это:

string Query = String.Format("SELECT DISTINCT TOP 3 ArticleName FROM tblArticles WHERE UserID={0} ORDER BY PostDate DESC", UserID); 
Смежные вопросы