【问题标题】:Select only some rows from database仅从数据库中选择一些行
【发布时间】:2013-04-19 04:11:15
【问题描述】:

我有以下疑问:

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

我希望为“ArticleName”获取不超过 3 个不同的值。
有可能这样做吗? (没有选择所有的“ArticleName”,只选择其中的 3 个?)

谢谢。

【问题讨论】:

  • 哪个数据库?也有特定于数据库的解决方案。
  • 我正在使用“Microsoft Access 数据库 (.mdb)”

标签: database ms-access select select-query


【解决方案1】:

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

更新:看看不同的 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;
 }

【讨论】:

    【解决方案2】:

    通常您可以在查询末尾使用LIMIT 3 来实现此目的

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

    或者对于 Microsoft Access DB,您显然需要在开始时使用 TOP 3,例如:

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

    【讨论】:

      【解决方案3】:

      也许

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

      【讨论】:

      • 我收到错误消息,指出以下字符串不起作用,因为 DISTINCT 和 ORDER BY 冲突。
      • 是的,抱歉。将 PostDate 添加到您选择的列列表中可以解决冲突。这可以接受吗?
      • 如果没有,一个快速的解决方法是在临时表中写入 ArticleName、PostDate,然后从该临时表中选择一列
      • 是的,现在它正在工作,你能解释一下“DISTINCT”是什么意思吗?
      • 专家的答案在这里 -> blog.sqlauthority.com/2007/12/20/….
      【解决方案4】:

      使用这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多