如何使用SQL合并一个空的完整获取行
我试图解决的情况是:对于表中的每一行,可能存在第二个表中的另一行,因此我需要第一个表行中的所有数据以及第二个表行中的数据(如果存在) 我知道我可以使用数据结构作为宿主变量来收集表中一行的所有数据。因此,我的选择是:如何使用SQL合并一个空的完整获取行,sql,db2-400,rpgle,Sql,Db2 400,Rpgle,我试图解决的情况是:对于表中的每一行,可能存在第二个表中的另一行,因此我需要第一个表行中的所有数据以及第二个表行中的数据(如果存在) 我知道我可以使用数据结构作为宿主变量来收集表中一行的所有数据。因此,我的选择是: select t1.* ,t2.* into :dst1 ,:dst2 from table1 t1 left join table2 t2 on t2.key=t1.key ; 其中,dst1和dst2是数据结构,分别类似于表1和表2记录的格式。很
select
t1.*
,t2.*
into
:dst1
,:dst2
from table1 t1
left join table2 t2 on t2.key=t1.key
;
其中,dst1和dst2是数据结构,分别类似于表1和表2记录的格式。很简单
现在,关键是如何在第二个表中不存在该键的行时捕获空结果。在这种情况下,我希望初始化相应的数据结构,但是coalesce一次只能处理一个字段,我还没有找到另一个解决方案
有没有办法得到这个结果
任何帮助都将不胜感激
谢谢解决这个问题的一种方法是使用指标变量。看起来是这样的:
dcl-ds hs Qualified;
field1 ...
field2 ...
endds;
dcl-s hsind Int(5) Dim(2);
exec sql
select *
into :hs:hsind
from table
fetch first row only;
select
t1.*
,t2.*
into
:dst1:dst1ind
,:dst2:dst2ind
from table1 t1
left join table2 t2 on t2.key=t1.key
;
注意:hs和:hsind之间没有逗号(,),因为这是同一变量赋值的一部分:hsind是一个指示符变量,在本例中是一个Int(5)
数组,其元素数与主机数据结构相同:hs有字段。如果:hs中关联字段中的值良好,则指示符变量将包含0;如果为空,则包含-1。所以在我们上面的例子中:如果hs.field1是好的,而hs.field2是空的,那么hsind(1)=0,hsind(1)=-1。其他值表示其他内容,如数据映射错误(-2)或字符串截断(字符串原始长度为正数)
因此,在您的示例中,使用如下内容:
dcl-ds hs Qualified;
field1 ...
field2 ...
endds;
dcl-s hsind Int(5) Dim(2);
exec sql
select *
into :hs:hsind
from table
fetch first row only;
select
t1.*
,t2.*
into
:dst1:dst1ind
,:dst2:dst2ind
from table1 t1
left join table2 t2 on t2.key=t1.key
;
其中,
dst1ind
是一个数组,如果Int(5)具有与dst1
相同数量的元素,则它具有子字段,类似于dst2ind
。然后在选择之后,只需选中dst2ind(1)>=0
,您就有了一个很好的选择。请注意,您需要确保select-into
只返回一行,否则会出现错误。处理此问题的一种方法是使用指示符变量。看起来是这样的:
dcl-ds hs Qualified;
field1 ...
field2 ...
endds;
dcl-s hsind Int(5) Dim(2);
exec sql
select *
into :hs:hsind
from table
fetch first row only;
select
t1.*
,t2.*
into
:dst1:dst1ind
,:dst2:dst2ind
from table1 t1
left join table2 t2 on t2.key=t1.key
;
注意:hs和:hsind之间没有逗号(,),因为这是同一变量赋值的一部分:hsind是一个指示符变量,在本例中是一个Int(5)
数组,其元素数与主机数据结构相同:hs有字段。如果:hs中关联字段中的值良好,则指示符变量将包含0;如果为空,则包含-1。所以在我们上面的例子中:如果hs.field1是好的,而hs.field2是空的,那么hsind(1)=0,hsind(1)=-1。其他值表示其他内容,如数据映射错误(-2)或字符串截断(字符串原始长度为正数)
因此,在您的示例中,使用如下内容:
dcl-ds hs Qualified;
field1 ...
field2 ...
endds;
dcl-s hsind Int(5) Dim(2);
exec sql
select *
into :hs:hsind
from table
fetch first row only;
select
t1.*
,t2.*
into
:dst1:dst1ind
,:dst2:dst2ind
from table1 t1
left join table2 t2 on t2.key=t1.key
;
其中,
dst1ind
是一个数组,如果Int(5)具有与dst1
相同数量的元素,则它具有子字段,类似于dst2ind
。然后在选择之后,只需选中dst2ind(1)>=0
,您就有了一个很好的选择。请注意,您需要确保select-into
只返回一行,否则会出现错误。我认为唯一的方法是将coalesce应用于表t2中的所有字段,如coalesce(t2.field1,t1.field1)。我不会命名每个字段,因为这两种记录格式都有大量字段。如果至少有另一个解决方案是可能的,则合并不是强制性的解决方案。SELECT*
不应在生产中使用。您真的需要所有当前字段吗?即使你这样做了,你也应该在99%或99%的时间内明确地命名它们。获取当前列的列表并不困难<代码>选择listagg(column_name concat',')作为qsys2.syscolumns中的columnList,其中table_name='MYTABLE'和table_schema='MYLIBRARY'是的,你是对的,肯定的,也许我最终会命名我真正需要的字段。尽管如此,我们还是习惯于获取整个记录格式,即使不需要所有字段,因为这是链式操作代码所做的,并且可能会有所帮助。我认为这里唯一的方法是将coalesce应用于表t2中的所有字段,就像这个coalesce(t2.field1,t1.field1)。我不会命名每个字段,因为两种记录格式都有大量的数据。如果至少有另一个解决方案是可能的,则合并不是强制性的解决方案。SELECT*
不应在生产中使用。您真的需要所有当前字段吗?即使你这样做了,你也应该在99%或99%的时间内明确地命名它们。获取当前列的列表并不困难<代码>选择listagg(column_name concat',')作为qsys2.syscolumns中的columnList,其中table_name='MYTABLE'和table_schema='MYLIBRARY'是的,你是对的,肯定的,也许我最终会命名我真正需要的字段。尽管如此,我们还是习惯于获取整个记录格式,即使不需要所有字段,因为这是链式操作代码的作用,可能会有所帮助。我尝试过,但我认为如果填写了整个DS,一个指示器就足以表示找到了或没有记录格式,当你告诉我在任何情况下都需要每个字段的指标时。这是一个解决方案,但必须提前知道字段的数量。是的,数据结构中的每个字段都需要一个指示符,是的,必须提前知道字段的数量。但是,如果您不使用选择*
,这是一种最佳做法,那么您将知道字段的数量。我尝试过,但我认为如果填写了整个DS,一个指示符就足以表明记录格式是否找到,而您告诉我在任何情况下都需要每个字段的指示符。这是一个解决方案,但必须提前知道字段的数量。是的,数据结构中的每个字段都需要一个指示符,是的,必须提前知道字段的数量。但如果不使用选择*