【问题标题】:sql select statement against a csv file, using JET.OLEDB driver使用 JET.OLEDB 驱动程序对 csv 文件执行 sql select 语句
【发布时间】:2012-05-10 14:50:52
【问题描述】:

我正在尝试执行以下 SQL 语句(在 SQL Server 2005 中构建和测试)

 Select *
 From mytesttable
 where myPk in
 (
      select t3 from (
          select field1, substring(field3, charindex(":", field3),6) t2, min(mypk) t3
          from mytesttable
          group by field2, substring(field3, charindex(":", field3),6)
      ) t
  ) 

我知道我不能使用子字符串或字符索引。所以最里面的选择在vbs中是这样的:

strsql = "select mid(field3, instr(1, field3, ":")), min(mypk) from "
strsql = strsql & myCSVFileName 
strsql = strsql & myCSVFileName & " GROUP By mid(field3, instr(1, field3, ":")) "

这运行良好。

但是当我尝试添加下一个选择来包装最内部的选择时,它会失败。代码如下所示:

strsql = "select mypk from ( select mid(field3, instr(1, field3, ":")), min(mypk)     from "
strsql = strsql & myCSVFileName 
strsql = strsql & myCSVFileName & " GROUP By mid(field3, instr(1, field3, ":")) )"

我得到的错误信息是有

没有为一个或多个必需参数指定值

有什么建议吗? 谢谢。

【问题讨论】:

    标签: sql-server-2005 jet subquery


    【解决方案1】:

    不知道Jet,但是在SQL Server等平台,派生表必须有别名。换句话说,你需要

    ... FROM (select ... ) AS YouMustProvideAnAliasForThisDerivedTable
    

    每次提到列(mypk 与 myPk)时,也要小心使用相同的大小写,尽管这似乎不是问题。

    【讨论】:

    • 在使用 MS Access (Jet/ACE) 时不必为派生表设置别名
    【解决方案2】:

    您的字符串中有一些错误,但在 Jet 中不需要为派生表提供别名。

    您重复了带有 csv 名称的行,在应该使用单引号或两个双引号时使用了双引号,并且没有返回名为 mypk 的字段。这对我有用,但前提是字段 3 始终包含带有冒号的文本。

    myCSVFileName = "Table.csv"
    strsql = "select pk from ( select mid(field3, instr(1, field3, ':')), min(mypk) as pk from "
    strsql = strsql & myCSVFileName & " GROUP By mid(field3, instr(1, field3, ':')) )"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-06
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      相关资源
      最近更新 更多