有人可以解释下面查询的执行顺序吗?
以下查询用于将日期附加到文件名并生成相应的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
我理解了查询,但它是如何按上述顺序排列的。如果我更改了查询行,它会给出另一个输出(即订单很重要)
答案 0 :(得分:0)
正如@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
的来电。此标量函数允许您指定如何将日期类型转换为字符串类型的格式。我认为它比使用子串更清楚。
答案 1 :(得分:0)
重申@mustaccio,没有任何东西可以控制订单。
您很幸运,因为数据库选择按顺序输出结果,因为数据库认为这是最简单的"或者"最便宜的"今天做的方式。我对它挑选的订单感到非常惊讶。猜测有很多试验和错误才能正确订购。
可以想象,随着任何给定修复(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;