如何在 HSQLDB 中使用多行 SELECT 语句导出数据?

Posted

技术标签:

【中文标题】如何在 HSQLDB 中使用多行 SELECT 语句导出数据?【英文标题】:How can I use a multi-line SELECT statement in HSQLDB to export data? 【发布时间】:2011-11-17 15:40:12 【问题描述】:

当我使用命令“java -jar sqltool.jar --rcFile sqltool.rc db_file q.sql”在 HSQLDB 2.2.5 中运行以下脚本时,我收到错误消息:“用户缺少权限或找不到对象: 选择”。如果我将\x 命令设为单行语句,HSQLDB 将成功执行脚本。我想将我的\x 分成多行以提高可读性。如何在 HSQLDB 脚本中使用多行 \x 命令?

--q.sql
DROP TABLE "PUBLIC"."TABLE1" IF EXISTS;

CREATE TABLE "PUBLIC"."TABLE1" (
  "C1" VARCHAR(10),
  "C2" VARCHAR(10),
  "C3" VARCHAR(10)
);

INSERT INTO "PUBLIC"."TABLE1" ("C1", "C2", "C3") VALUES ('a', 'b', 'c');
INSERT INTO "PUBLIC"."TABLE1" ("C1", "C2", "C3") VALUES ('d', 'e', 'f');

DROP TABLE "PUBLIC"."TABLE2" IF EXISTS;

CREATE TABLE "PUBLIC"."TABLE2" (
  "C1" VARCHAR(10),
  "C2" VARCHAR(10)
);

INSERT INTO "PUBLIC"."TABLE2" ("C1", "C2") VALUES ('a', 'b');
INSERT INTO "PUBLIC"."TABLE2" ("C1", "C2") VALUES ('u', 'v');

* *DSV_COL_DELIM=,
* *DSV_ROW_DELIM=\n
* *DSV_TARGET_FILE=results.csv

\x SELECT
( SELECT TOP 1 "T2"."C1" FROM "PUBLIC"."TABLE2" "T2" WHERE "T2"."C1" = "T1"."C1") AS "T2C1",
"T1"."C2" AS "T1C2"
FROM "PUBLIC"."TABLE1" "T1"
ORDER BY "T2C1", "T1C2"

更新:根据@Blaine 的建议,我切换到HSQLDB 2.2.6 并将上述脚本中的\x 命令替换为以下内容:

\.

SELECT
(SELECT TOP 1 "T2"."C1" FROM "PUBLIC"."TABLE2" "T2"
 WHERE "T2"."C1" = "T1"."C1") AS "T2C1",
"T1"."C2" AS "T1C2"
FROM "PUBLIC"."TABLE1" "T1"
ORDER BY "T2C1", "T1C2"

.;

\x :

【问题讨论】:

【参考方案1】:

这需要版本 2.2.6。

一旦您拥有 2.2.6,\x? 将向您展示您需要知道的一切。

由于您希望它在脚本中工作,您可以使用原始模式将多行 SQL 语句输入到 SqlTool 的命令缓冲区中,然后使用\x :。助记符:“:”表示SqlTool的编辑缓冲区。

【讨论】:

我从hsqldb.org/support/hsqldb_16.zip 获得了 2.2.6 的预发布快照,并在我的脚本中将 "\x SELECT" 替换为 "\x : SELECT"。但是,我收到错误消息:“意外令牌:*”。我还需要进行任何其他更改吗? HyperSQL 2.2.6 现已公开。您可以从 Sourceforge 下载 zip。请参阅 hsqldb.svn.sourceforge.net/viewvc/hsqldb/base/trunk/testrun/… 以获取符合您要求的工作示例。 我编辑了您的答案以包含我在 HSQLDB 2.2.6 中成功运行的命令。 由于我的编辑被拒绝(参见***.com/suggested-edits/144660),我编辑了我的问题。

以上是关于如何在 HSQLDB 中使用多行 SELECT 语句导出数据?的主要内容,如果未能解决你的问题,请参考以下文章

CSV , JAVA & HSQLDB

hsqldb select查询真的很慢

如何在 CASE WHEN 语句中获取 HSQLDB 中超过 1000 个项目?

使用 HSQL DB 测试插入所有 Oracle 查询

HSQLDB: INSERT INTO ... (SELECT NULL, * FROM) 导致“列名重复”

如何从具有多行的 SQL 查询中获取非字符串数组字段