【问题标题】:Character Set mismatch in Oracle SQLOracle SQL 中的字符集不匹配
【发布时间】:2018-10-16 09:43:26
【问题描述】:

在 Oracle SQL Developer 3.1.07 中,下面的两个子查询可以自行正确运行。我要做的就是将它们合并在一起,但 Oracle 给出了 ORA-12704: 字符集不匹配错误。我检查了类似的帖子以检查 UNION 语法,但我不明白错误来自哪里。 select 语句从两个查询中的相同列中选择字段,因此应该没有数据类型问题。

    SELECT assessmentid,
       claimdate,
       firstdiagnosis,
       affectedsystemdesc,
       thirdparty,
       SUM(settledamount) AS sam,
       param
  FROM (
  SELECT x.xclaimassessment.assessmentid,
         x.xclaimassessment.thirdparty,
         x.xclaimassessment.firstdiagnosis,
         x.xclaimassessment.affectedsystemdesc,
         x.xclaimassessment.claimdate,
         x.xclaimtreatmentinvoice.settledamount,
         'Q1' AS param
    FROM x.xclaimassessment left
    JOIN x.xclaimtreatment
  ON x.xclaimassessment.assessmentid = x.xclaimtreatment.assessmentid
    LEFT JOIN x.xclaimtreatmentinvoice
  ON x.xclaimtreatment.treatmentid = x.xclaimtreatmentinvoice.treatmentid
   WHERE ( ( icd9 = '501'
      OR icd9 = '162' )
     AND thirdparty = 'N' )
     AND months_between(
    SYSDATE,
    TO_DATE(
      x.xclaimassessment.claimdate
    )
  ) < 25
)
 GROUP BY assessmentid,
          claimdate,
          firstdiagnosis,
          affectedsystemdesc,
          thirdparty,
          param
UNION
SELECT assessmentid,
       claimdate,
       firstdiagnosis,
       affectedsystemdesc,
       thirdparty,
       SUM(settledamount) AS sam,
       param
  FROM (
  SELECT x.xclaimassessment.assessmentid,
         x.xclaimassessment.thirdparty,
         x.xclaimassessment.firstdiagnosis,
         x.xclaimassessment.affectedsystemdesc,
         x.xclaimassessment.claimdate,
         x.xclaimtreatmentinvoice.settledamount,
         'Q2' AS param
    FROM x.xclaimassessment left
    JOIN x.xclaimtreatment
  ON x.xclaimassessment.assessmentid = x.xclaimtreatment.assessmentid
    LEFT JOIN x.xclaimtreatmentinvoice
  ON x.xclaimtreatment.treatmentid = x.xclaimtreatmentinvoice.treatmentid
   WHERE months_between(
    SYSDATE,
    TO_DATE(
      x.xclaimassessment.claimdate
    )
  ) < 25
)
 GROUP BY assessmentid,
          claimdate,
          firstdiagnosis,
          affectedsystemdesc,
          thirdparty,
          param
HAVING SUM(settledamount) > 50000;

我们将不胜感激!

【问题讨论】:

  • 离题:我仍然想知道为什么 Oracle 数据库开发人员/管理员大部分时间都使用别名。表名和列名全部大写,使查询更难阅读,因为您无法直接看到表名、列名等标识符和 SQL 关键字和 SQL 函数等语法之间的区别。
  • 显示所有涉及的表的表结构。“为什么我要为我认为非常简单的 SQL 查询提供 MCVE?” -> meta.stackoverflow.com/questions/333952/…
  • 基本上我是在工作中自学这一点,而我取代的那个人使用的是 CAPS。所以认为这是一个很好的做法。由于您提到的原因(即可读性),我更喜欢小写字母,所以也许我会切换。
  • 是否涉及任何 nchar、nvarchar 或 nclob 列?此外,如果您愿意,我可以重新格式化 Raymond 的查询格式,这样可以更轻松地阅读它。最后一个 PS,3.1 版到现在已经 6 岁了……
  • thatJeffSmith 是的,有一个 NVARCHAR2 (1 CHAR) 列是问题所在。我现在将发布解决方案。

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

好的,感谢我的经理 K 先生,他真正解决了这个问题。

问题出在 THIRDPARTY 列上,它在两个子查询中是相同的数据类型。为了解决这个问题,我们在两个子查询中都使用了 CAST (field AS VARCHAR(3))。

我们通过从查询中删除除第一个字段之外的所有字段,然后将它们一个接一个地添加回来,直到它中断,从而确定了问题字段。

我们仍然不明白为什么会发生此错误,因此有关此问题的任何信息仍将被应用。这是已解决的代码:

SELECT ASSESSMENTID,CLAIMDATE, FIRSTDIAGNOSIS, AFFECTEDSYSTEMDESC, THIRDP, SUM(SETTLEDAMOUNT) AS SAM, PARAM
FROM (
      SELECT X.XCLAIMASSESSMENT.ASSESSMENTID, CAST(X.XCLAIMASSESSMENT.THIRDPARTY AS VARCHAR(3)) AS THIRDP,
      X.XCLAIMASSESSMENT.FIRSTDIAGNOSIS, X.XCLAIMASSESSMENT.AFFECTEDSYSTEMDESC, 
      X.XCLAIMASSESSMENT.CLAIMDATE, X.XCLAIMTREATMENTINVOICE.SETTLEDAMOUNT, 'Q1' as PARAM
      FROM X.XCLAIMASSESSMENT
      LEFT JOIN X.XCLAIMTREATMENT
      ON X.XCLAIMASSESSMENT.ASSESSMENTID = X.XCLAIMTREATMENT.ASSESSMENTID
      LEFT JOIN X.XCLAIMTREATMENTINVOICE
      ON X.XCLAIMTREATMENT.TREATMENTID = X.XCLAIMTREATMENTINVOICE.TREATMENTID
      WHERE ((ICD9 = '501' or ICD9 = '162') and THIRDPARTY = 'N')and MONTHS_BETWEEN(SYSDATE,to_date(X.XCLAIMASSESSMENT.CLAIMDATE))< 25)
      GROUP BY  ASSESSMENTID, CLAIMDATE, FIRSTDIAGNOSIS, AFFECTEDSYSTEMDESC, THIRDP, PARAM
      UNION
SELECT ASSESSMENTID, CLAIMDATE, FIRSTDIAGNOSIS, AFFECTEDSYSTEMDESC, THIRDP, SUM(SETTLEDAMOUNT) AS SAM, PARAM
FROM(
      SELECT X.XCLAIMASSESSMENT.ASSESSMENTID, CAST(X.XCLAIMASSESSMENT.THIRDPARTY AS VARCHAR(3)) AS THIRDP,
      X.XCLAIMASSESSMENT.FIRSTDIAGNOSIS, X.XCLAIMASSESSMENT.AFFECTEDSYSTEMDESC, 
      X.XCLAIMASSESSMENT.CLAIMDATE, X.XCLAIMTREATMENTINVOICE.SETTLEDAMOUNT, 'Q2' as PARAM
      FROM X.XCLAIMASSESSMENT
      LEFT JOIN X.XCLAIMTREATMENT
      ON X.XCLAIMASSESSMENT.ASSESSMENTID = X.XCLAIMTREATMENT.ASSESSMENTID
      LEFT JOIN X.XCLAIMTREATMENTINVOICE
      ON X.XCLAIMTREATMENT.TREATMENTID = X.XCLAIMTREATMENTINVOICE.TREATMENTID
      WHERE MONTHS_BETWEEN(SYSDATE,to_date(X.XCLAIMASSESSMENT.CLAIMDATE))< 25)
      GROUP BY ASSESSMENTID, CLAIMDATE, FIRSTDIAGNOSIS, AFFECTEDSYSTEMDESC, THIRDP, PARAM
      HAVING SUM(SETTLEDAMOUNT) > 50000;    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2016-12-04
    相关资源
    最近更新 更多