【发布时间】:2021-06-02 10:30:48
【问题描述】:
这是我试图在我的程序中运行的 SQL 查询。但是我什至无法编译它,我收到一个错误,只是告诉我查询中有问题。
我得到的错误是“SQL0117 语句包含错误数量的值”。
/Free
exec sql
INSERT INTO NOEDTSR
SELECT * FROM NOEDEH AS deh
WHERE EXISTS (SELECT act.AC2ACT FROM ACTEST AS act
WHERE act.AC2ACT = deh.N1ACTE
AND act.AC2CRB IN('C0','C2')
AND act.AC2TYT = 'DEN')
AND NOT EXISTS (SELECT sin.SISTE FROM SINREG AS sin
WHERE sin.SISTE = deh.N1STE
AND sin.SIGRP = deh.N1GRP
AND sin.SIIND = deh.N1IND
AND sin.SIRANG = deh.N1RANG
AND sin.SIACTE = deh.N1ACTE
AND sin.SIREEL = deh.N1MERG
AND sin.SISECU = deh.N1EBAS)
AND N1DBSS = 20
AND N1DBSA = 21
AND N1TIER = '000000000000000';
/end-free
我不是故意在此处指定 column_names,因为我想将所有列从 NOEDEH 复制到 NOEDTSR。
这两个表的结构相同,用于编译两者的DDS(Data Description Structure)完全相同。
有什么想法吗?
【问题讨论】:
-
您声称查询返回与目标表相同的列是错误的。这就是错误所说的。明确列出列。
-
可能这两个表没有相同的列。明确列名以避免此类问题始终是一种好习惯。
-
您需要明确指定所有插入的列,因为可以以任何方式重新组织表(添加新列,或者可以使用新列顺序重新创建,或者可以被另一个对象替换)并且没有人可以保证你的列顺序。
-
感谢您的回答,我知道指定列很重要,但是在这种情况下,表有 107 个列,我试图找到解决方法。我尝试使用带有 qsys2.syscolumns2 的另一个程序列出列,但我不能在我的 INSERT 语句中使用 RPG 变量...
-
以下查询的结果是什么?
SELECT TABLE_SCHEMA, TABLE_NAME, COUNT(1) CNT , LISTAGG (COLUMN_NAME, ', ') AS COLS FROM QSYS2.SYSCOLUMNS WHERE TABLE_SCHEMA = 'YOUR_SCHEMA' AND TABLE_NAME IN ('NOEDEH', 'NOEDTSR') GROUP BY TABLE_SCHEMA, TABLE_NAME。相应地设置您的架构名称。您可以注释掉最后一列,在该列中您会得到一个以逗号分隔的所有表列的列表,并可用于构造您的 INSERT SELECT 查询。