有人能解释一下下面查询的执行顺序吗?
以下查询用于将日期附加到文件名并生成相应的ftp卡。
SELECT CHAR('close',80) FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR(' /CSSC/Inbound/AP_MP_P2C_A47_Report/A47_"' ||
SUBSTR(CHAR(CURRENT DATE,ISO),6,2) ||
SUBSTR(CHAR(CURRENT DATE,ISO),9,2) ||
SUBSTR(CHAR(CURRENT DATE,ISO),3,2) || '.TXT',80)
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR(
'put ' ||
X'27' ||
'MCSP.WMCS11CD.OPENPOS.TABFILE.TEMP' ||
X'27' ||
' +'
,80)
FROM
SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR('ASCII',80) FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR('quit',80) FROM SYSIBM.SYSDUMMY1;
结果是
ASCII
put 'MCSP.WMCS11CD.OPENPOS.TABFILE.TEMP' +
/CSSC/Inbound/AP_MP_P2C_A47_Report/A47_110914.TXT
close
quit
我理解这个问题,但它是如何按照上面的顺序出现的。如果我更改查询行,它将给出另一个输出(即订单事项)
正如@mustaccio所说,除非提供ORDER BY
子句,否则没有订单。如果没有该子句,数据库引擎将选择"最简单"的方法来返回数据。甚至不能保证在查询的两次连续运行之间是相同的顺序。
如果您需要一个特定的订单,那么您应该添加一个提供订单的新字段,并使用ORDER BY
子句:
SELECT text FROM (
SELECT CHAR('ASCII',80), 1 FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR( 'put ' || X'27' ||
'MCSP.WMCS11CD.OPENPOS.TABFILE.TEMP' ||
X'27' || ' +' ,80), 2
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR(' /CSSC/Inbound/AP_MP_P2C_A47_Report/A47_' ||
VARCHAR_FORMAT(CURRENT DATE, 'MMDDYY') ||
'.TXT',80), 3
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR('close',80), 4 FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR('quit',80), 5 FROM SYSIBM.SYSDUMMY1
) AS A (text, num)
ORDER BY num
并不是说我已经将您的DATE
子字符串更改为对VARCHAR_FORMAT
的调用。此标量函数允许您指定如何将日期类型转换为字符串类型的格式。我认为这比必须使用子字符串要清楚得多。
重申@mustaccio,没有什么可以控制订单。
幸运的是,DB选择按顺序输出结果,因为DB认为这是目前"最简单"或"最便宜"的方法。事实上,我对它选择的订单感到非常惊讶。猜测有很多尝试和错误,以使它的秩序正确。
该顺序可能会随着任何给定修复程序(PTF)的安装而发生变化。
在我看来,这是一种非常糟糕的构建FTP脚本的方法。但如果你要这样做,你应该像那样做
with tbl (linenbr, stmt) as (
SELECT 4, CHAR('close',80) FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT 3, CHAR(' /CSSC/Inbound/AP_MP_P2C_A47_Report/A47_"' ||
SUBSTR(CHAR(CURRENT DATE,ISO),6,2) ||
SUBSTR(CHAR(CURRENT DATE,ISO),9,2) ||
SUBSTR(CHAR(CURRENT DATE,ISO),3,2) || '.TXT',80)
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT 2, CHAR(
'put ' ||
X'27' ||
'MCSP.WMCS11CD.OPENPOS.TABFILE.TEMP' ||
X'27' ||
' +'
,80)
FROM
SYSIBM.SYSDUMMY1
UNION ALL
SELECT 1, CHAR('ASCII',80) FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT 5, CHAR('quit',80) FROM SYSIBM.SYSDUMMY1
)
SELECT stmt from TBL
ORDER BY linenbr;