对于Iseries / IBMi DB2。
我一起加入多个文件/表格。
我已经在DDS和SQL中编写了代码。
DDS逻辑文件完全按预期工作,但我不能在rpgle中将它用于嵌入式sql,因为它默认为SQE引擎,导致可怕的性能。
另一方面,在我使用NULLs
之前,SQL视图已IFNULL( MBRDESCR, '')
。但现在MBRDECSR
是VARCHAR
。这是不可接受的。
那么如何在没有NULLs
和VARCHARs
?
请求的示例代码:
DDS:
JDFTVAL R TRANSR JFILE(TRANSPF MBRPF) J JOIN(1 2) JFLD(MBRID MBRID) * TRANSID JREF(1) MBRID JREF(1) MBRNAME JREF(2) MBRSURNME JREF(2) * K TRANSID K MBRID
SQL:
CREATE VIEW TRANSV01 AS ( SELECT TRANSID , MBRID , CAST(IFNULL(MBRNAME , '') as Char(20)) , CAST(IFNULL(MBRSURNME, '') as Char(25)) FROM TRANSPF --Member Name LEFT OUTER JOIN MBRPF on MBRID = MBRID ) RCDFMT TRANSR;
请注意以下事项:
以上示例简化
并非每个TRANSPF中的MBRID在MBRPF中都有相应的条目(即没有参考约束)。因此,当MBRPF连接到TRANSPF时,MBRNAME,MBRSURNME中将存在NULL值。除非使用JDFTVAL或IFNULL()。
由于性能和rpgle中的extname(),我不想拥有VARCHAR。
我不想拥有NULL值,我不希望pgm必须处理它们。
答案 0 :(得分:0)
假设您发现不合适的'允许空值',请使用UNION。第一个SELECT选择匹配的所有行,这将为您设置NOT NULL属性。第二个SELECT选择所有没有匹配的行 - 您为这些行提供填充字段。
CREATE VIEW TRANSV01 AS (
SELECT TRANSID ,
MBRID ,
MBRNAME ,
MBRSURNME
FROM TRANSPF
--Member Name
JOIN MBRPF on MBRID = MBRID
UNION
SELECT TRANSID ,
MBRID ,
CAST('') as Char(20)) ,
CAST('') as Char(25))
FROM TRANSPF
--Member Name
EXCEPTION JOIN MBRPF on MBRID = MBRID
) RCDFMT TRANSR;