【发布时间】:2017-06-08 14:35:31
【问题描述】:
我正在处理来自 Oracle 数据库的 Solr dataimport。数据库系统有一组表,专门用于存储对其他表中更改的引用。
例如,我可能有一个名为PERSON 的表,当将记录添加到此表时,它们的ID 将添加到PERSON_CHANGED 表中。我想在定义我的deltaQuery 时使用这个PERSON_CHANGED 表,以便Solr 只索引后续索引中更改的记录。作为此过程的一部分,我需要在 Solr 完成导入(增量或完整)后从 PERSON_CHANGED 表中删除我已读取的记录,以便以后不再处理它们。
在dataimport 之后运行这种“清理”SQL 查询的最佳方式是什么?
我尝试过像这样组合两个查询(为简洁起见):
<dataConfig>
<dataSource ... >
<document>
<entity name="person"
query="
SELECT ID, FIRST_NAME, LAST_NAME
FROM PERSON
WHERE '${dataimporter.request.clean}' != 'false'
OR PERSON_ID IN (
SELECT ID FROM CHANGED_PERSON
);
DELETE * (
SELECT * FROM CHANGED_PERSON
);
" />
</document>
</dataConfig>
但这会导致SQL command not properly ended 错误。 Solr 是否提供了一种方法来进行这种清理?
【问题讨论】:
-
嗨,你的 SOLR 版本是多少?
-
@jeorfevre - 我正在使用 Solr 6.5.1。
-
您的 Delete 语句未指定要用于删除的表,
DELETE person where person_id in ( SELECT ID FROM CHANGED_PERSON ); -
另外,我刚刚注意到您的 select 语句中没有定义
p.PERSON_ID的别名引用。请务必附加“p”作为 PERSON 的表别名。 -
谢谢@JairHernandez。我简化了这篇文章的查询,忘记删除别名。当我在我的 SQL 客户端应用程序中运行这两个查询(SELECT 和 DELETE)时,它们都可以正常工作。在 DELETE 语句中似乎不需要表名 - 我从这里遵循模式:stackoverflow.com/a/33262653/1063392。