sql - 如何在 nifi 中执行 SQL 处理器中执行“NOT IN”子句
问题描述
我正在尝试使用 Apache nifi 中的“ExecuteSQL”处理器执行以下查询。
INSERT INTO SampleDB VALUES (${rno}, '${tno}', '${tval}', '${lotno}', '${datval}') WHERE ${rno} NOT IN (SELECT rno FROM SampleDB);
这里${rno}
作为流文件属性获得。
执行时出现以下错误:
ExecuteSQL[id=01781107-63a4-1204-8110-6b19db3d5ffc] 无法执行 SQL 选择查询 INSERT INTO LimsOnCloud VALUES (1, 'CTG123', 'ITM123', '123', '5') WHERE 1 NOT IN (SELECT rno来自样本数据库);对于 StandardFlowFileRecord[uuid=93db20b2-5f9f-4521-ac42-11239abb94c2,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1615281573937-132, container=default, section=132], offset=168254, length=152],offset=0 ,name=098a8ad2-0dc9-4564-a242-8b4855b619b2,size=152] 由于关键字“WHERE”附近的语法不正确。;路由失败:com.microsoft.sqlserver.jdbc.SQLServerException:关键字“WHERE”附近的语法不正确。
无法弄清楚错误在哪里,或者有什么更好的方法来实现这一点。
解决方案
您应该使用正确的参数化查询。
要使用
WHERE
类似的,您需要SELECT
.您还应该指定要显式插入的列名。
NOT IN
面对可为空的对象时倒下,所以NOT EXISTS
取而代之的是青睐。
INSERT INTO SampleDB
(rno, tno, tval, lotno, datval)
SELECT @rno, @tno, @tval, @lotno, @datval
WHERE NOT EXISTS (SELECT 1
FROM SampleDB
WHERE rno = @rno
);
推荐阅读
- angular - 角度保存/恢复组件状态
- android-volley - 使用 Volley 与 BigCommerce 的 Orders API 端点交互时,如何解决“未知主机异常”?
- sql - 多行到列值按列在 SQL Server 中分组
- python-3.x - Python中的PyVisa.errors.VisaIOError异常处理
- prebid.js - 我可以在 prebid 中更改价格粒度吗
- python - 如何从对象访问值
- powershell - Powershell 列出所有名为“Create”的方法
- r - 与转移论点的递归关系
- javascript - 使用 {{data}} 编辑数据 Firestore
- html - 在图片前显示“SALE”标签