【问题标题】:Inserting a row not working插入行不起作用
【发布时间】:2017-10-14 04:44:32
【问题描述】:

谁能告诉我为什么这段代码不起作用?我在第 1 行和第 2 行不断出错。

我想为CUSTLA 表中的每一行在PROBLEMTABLE 表中插入一行,其中CustCodeCUSTCATEGORY 源表中的PK 值不匹配。

第 1 行的错误没有给出原因,但第 2 行的错误表明该列的定义不明确。

INSERT INTO PROBLEMTABLE (problemid, source_rowid, source_table, filterid, datetime, action)
    SELECT 
        PROBLEM_SEQ.NEXTVAL, ROWID, 'CUSTLA', 2, CURRENT_DATE, 'MODIFY'
    FROM 
        CUSTLA U, CUSTCATEGORY Y
    WHERE 
        U.CustCode != Y.CustCode;

SELECT * FROM PROBLEMTABLE;

【问题讨论】:

  • 你能给我们错误的全文吗?
  • 描述已被编辑@GiorgosBetsos
  • 表 CUSTLA 和 CUSTCATEGORY 都包含同名的列,可能是列 ROWID。在您的SELECT 语句中,将表别名添加到两个表中都存在的列中,例如SELECT U.ROWID ...
  • 你的关系型数据库是什么?
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 年前),不鼓励使用它

标签: sql sql-insert


【解决方案1】:

您没有正确检查CUSTLAtable 中不存在的记录。试试这个查询:

INSERT INTO PROBLEMTABLE (problemid, source_rowid, source_table, 
                          filterid, datetime, action)
    SELECT PROBLEM_SEQ.NEXTVAL, ROWID, 'CUSTLA', 
           2, CURRENT_DATE, 'MODIFY'
    FROM CUSTLA U
    WHERE NOT EXISTS (SELECT 1 FROM CUSTCATEGORY Y WHERE U.CustCode = Y.CustCode)

您得到的错误是由于SELECTclause 中指定的字段,该字段存在于两个 CUSTLACUSTCATEGORY 表中。这被称为模糊字段,因为 RDBMS 引擎无法决定从哪个字段中选择。

注意:您的查询使用隐式CROSS JOIN 来检查不存在的记录。通过这种方式,您将获得大量冗余记录。

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多