从数据库

从数据库

问题描述:

只选择一些行,我有以下查询:从数据库

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

我想获得不超过3个的不同值ArticleName的“。
是否有可能这样做? (没有选择所有'ArticleName'只是其中3个?)

谢谢。

+0

哪个数据库?还有数据库特定的解决方案。 – Kangkan 2013-04-25 10:09:47

+0

我使用'Microsoft Access数据库(.mdb)' – 2013-04-25 10:11:19

通常,您可以在查询的末尾使用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

谢谢,但..我不工作... – 2013-04-25 10:15:55

+0

@NaveTseva请参阅编辑 – Anentropic 2013-04-25 10:19:09

+0

谢谢。现在它工作得很好! – 2013-04-25 10:22:54

你需要说你使用的是什么RDBMS。 Mysql和sqlite支持LIMIT指令,而其他系统可能支持或不支持TOP,FIRST或其他类似的指令。

更新:看RDBMS引擎如何支持这一点。请参阅infinispan的TableManipulation.java中的getLoadSomeRowsSql()方法。

这,万一链路停止工作:

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; 
} 

也许

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

由于DISTINCT和ORDER BY冲突,我得到了以下字符串不起作用的错误消息。 – 2013-04-25 10:15:35

+0

对不起。将PostDate添加到您正在选择的列列表可修复冲突。这可以接受吗? – 2013-04-25 10:20:55

+0

如果不是,一个快速的解决方法是在临时表中编写ArticleName,PostDate,然后从这个临时表中选择一列 – 2013-04-25 10:22:32

使用此:

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