1

我正在尝试在 AS400 上的 SQL 中进行子选择并得到“数据转换或数据映射错误” - 我很确定这与 SQL 在子选择中处理日期的方式有关(特别是它通过改变格式将逗号添加到十进制字段中,并且在进行下一次选择时会感到困惑)-有人可以为我确认吗?也许建议我需要如何解决这个问题?

基本上,我有类似下面的内容,日期为十进制,格式为:CCYYMMDD(即,如果您只是在它们作为 CC、YYM、MDD 出现的日期上进行选择)。日期来自 table3

SELECT *
FROM TABLE1 A
     CROSS JOIN TABLE2 B
     LEFT OUTER JOIN (SELECT *
                      FROM TABLE3 C 
                      LEFT OUTER JOIN TABLE4 D ON (blah)
                      INNER JOIN TABLE5 E  ON (blah)
                      WHERE DATE >= 20080101
                      AND   DATE <= 20090101
                     ) AS C ON (blah AND blah)
4

3 回答 3

4

我几乎没有过时的 AS/400 经验,但您的问题是经典的分而治之。

隔离子查询 - 它自己运行正常吗?然后从表 1 开始并确保交叉查询有效然后添加子查询。

我不知道 AS/400 是否支持它,但 SQL Server 的公用表表达式非常有用——基本上是本地范围的视图。我只提到它是因为您可以创建一个视图作为您的子查询以便更好地理解。

总而言之,我怀疑您的问题出在“胡说八道”之内:)

于 2009-04-06T16:24:13.057 回答
2

如果您使用本机 AS400 db,它的风格是:DB2 for iSeries(不要与 DB2 for Linux 和其他平台混淆)

如果是这样,并且如您所说,表 3 中的 DATE 字段是 CCYYMMDD 格式的十进制数字,那么您的比较就很好了。逗号是应用于显示的小数格式,不与值一起存储。

我同意 n8wrl,尝试一个简单的“从 DATE >= 20080101 的 Table3 中选择”,看看它是否运行,然后从那里开始工作。

废话,废话非常敏感:)

于 2009-04-07T17:51:18.330 回答
0

要正确回答这个问题,了解 AS400 使用的是哪种“SQL”会有所帮助。AS400 本身只是一个服务器。AS400 可以与许多数据库类型一起使用,例如 DB2、MS SQL Server、Oracle 等...

在不知道哪种 SQL 风格的情况下快速尝试一下,我会说您需要在日期值周围加上 '',这样它们就不会被视为数值。

日期 >= '20080101' 和日期 <= '20090101'

于 2009-04-06T23:16:36.887 回答