2020-09-28 09:27发布
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
大家好,
我面临以下问题:在PostGreSQL DB的UDT中,我正在两个表(例如A.column1 = B.column1)之间创建经典的等联接,当我使用LaunchPad查询时,它将转换联接 在"内部联接"中。
如何避免这种转变?
感谢您的帮助。
最后我找到了解决方案!
我已经在Universe的参数中将参数" SELFJOINS_IN_WHERE"添加为值"是"(参数ANSI_92也必须切换为"是"),并在.PRM文件中添加了此参数(对于我而言) ,即postgresql.prm)。
我已经导出了Universe,从现在开始它可以正常运行。
感谢Lars的帮助。
R。
你好,
我们当前正在使用SAP BusinessObjects BI 4.2 Support Pack 3 Patch 2。
此外,是的,在连接的翻译中似乎出现了"问题"。
自上次回答以来,我试图修改UDT或postgresql.prm文件中的参数,例如" ANSI_92"," OUTERJOINS_GENERATION"," FILTER_IN_FROM"等,但不幸的是没有任何更改。
让我尝试用一个简单的例子再次说明:)
在UDT中,我想在一个字段上连接两个表(so.w_agtpai_h_bo和rh.prefon)。 否则,表so.w_agtpai_h_bo在字段" cod_coll"上具有一个auto_join。 所以我有两个不同的联接:
数字1:so.w_agtpai_h_bo.paie_h_num_prefon = rh.prefon.num_classe
数字2:@Prompt(...)中的so.w_agtpai_h_bo.cod_coll
在BI LaunchPad中生成的查询如下:
SELECT * FROM so.w_agtpai_h_bo左外连接rh.prefon ON(so.w_agtpai_h_bo.paie_h_num_prefon = rh.prefon.num_classe和so.w_agtpai_h_bo.cod_coll in)(17)
如您所见,第二个联接包含在LEFT OUTER JOIN中,而UDT则不是这种情况! 结果是我的请求没有对值" 17001"的字段" cod_coll"进行过滤,因为它处于WHERE条件(或至少在OTUER JOIN之外)。
再次感谢您的帮助。
不太确定PostgreSQL问题是如何结束的。
但是,当您的查询只应在两个连接端都返回匹配项时,INNER JOIN是EQUI JOIN的正确执行。
仅当您要从连接的两端检索不匹配的记录时,才使用OUTER JOIN。
首先,谢谢您的回答。
我不确定我的问题是由PostGreSQL的行为引起的onyl,让我尝试用一个具体的例子来解释它。
对于这种情况,我正在使用您所说的OUTER JOIN,以便为两个表检索最大数量的值。 LaunchPad生成的请求返回以下语句(我尽力简化了):
选择* FROM rh.eqrem右外连接((选择 SO.w_agent_bo。* FROM SO.w_agent_bo 在哪里 SO.w_agent_bo。 cod_coll in('17001')和(CASE当'*'='@'THEN时SO.w_agent_bo.dt_deb_doss 当'*'='*'THEN date_trunc('day',current_date) ELSE to_date('*','DD/MM/YYYY')END)> = SO.w_agent_bo.dt_deb_doss 并且(如果'*'='@'然后,则为例SO.w_agent_bo.dt_fin_doss-间隔" 1天" 当'*'='*'THEN date_trunc('day',current_date) ELSE to_date('*','DD/MM/YYYY')END) )W_AGENT_BO ON(W_AGENT_BO.cod_clasremun = rh.eqrem.cod_clasremun 和W_AGENT_BO.cod_eqremun = rh.eqrem.cod_eqremun 和W_AGENT_BO.cod_typremun = rh_eq(' '@'THEN W_AGENT_BO.dt_deb_doss 当'*'='*'THEN date_trunc('day',current_date) ELSE to_date('*','DD/MM/YYYY')END)和(CASE当'*'='@'THEN W_AGENT_BO.dt_fin_doss-间隔'1天'当'*'='*'THEN date_trunc('day',current_date ) ELSE to_date('*','DD/MM/YYYY')END)> = rh.eqrem.dat_debut AND(condition1)AND(condition2))
,我想发表以下声明:
选择* FROM rh.eqrem右外连接((选择 SO.w_agent_bo。* FROM SO.w_agent_bo 在哪里 SO.w_agent_bo。 cod_coll in('17001')和(CASE当'*'='@'THEN时SO.w_agent_bo.dt_deb_doss 当'*'='*'THEN date_trunc('day',current_date) ELSE to_date('*','DD/MM/YYYY')END)> = SO.w_agent_bo.dt_deb_doss 并且(如果'*'='@'然后,则为例SO.w_agent_bo.dt_fin_doss-间隔" 1天" 当'*'='*'THEN date_trunc('day',current_date) ELSE to_date('*','DD/MM/YYYY')END) )W_AGENT_BO ON(W_AGENT_BO.cod_clasremun = rh.eqrem.cod_clasremun 和W_AGENT_BO.cod_eqremun = rh.eqrem.cod_eqremun 和W_AGENT_BO.cod_typremun = rh_eq(' '@'THEN W_AGENT_BO.dt_deb_doss 当'*'='*'THEN date_trunc('day',current_date) ELSE to_date('*','DD/MM/YYYY')END)和(CASE当'*'='@'THEN W_AGENT_BO.dt_fin_doss-间隔'1天'当'*'='*'THEN date_trunc('day',current_date ) ELSE to_date('*','DD/MM/YYYY')END)> = rh.eqrem.dat_debut)在(condition1)AND(condition2)
主要更改是在请求结束时,我不希望将" WHERE"条件包含在RIGHT OUTER JOIN内,因为这会修改我的condition1和condition2的行为。
这就是为什么我想使用" ="而不是INNER JOINS或OUTER JOINS保持初始等式联接的原因。或者您是否有任何想法像前面的示例所示"拆分" WHERE?
非常感谢您的参与。
最多设置5个标签!
最后我找到了解决方案!
我已经在Universe的参数中将参数" SELFJOINS_IN_WHERE"添加为值"是"(参数ANSI_92也必须切换为"是"),并在.PRM文件中添加了此参数(对于我而言) ,即postgresql.prm)。
我已经导出了Universe,从现在开始它可以正常运行。
感谢Lars的帮助。
R。
你好,
我们当前正在使用SAP BusinessObjects BI 4.2 Support Pack 3 Patch 2。
此外,是的,在连接的翻译中似乎出现了"问题"。
自上次回答以来,我试图修改UDT或postgresql.prm文件中的参数,例如" ANSI_92"," OUTERJOINS_GENERATION"," FILTER_IN_FROM"等,但不幸的是没有任何更改。
让我尝试用一个简单的例子再次说明:)
在UDT中,我想在一个字段上连接两个表(so.w_agtpai_h_bo和rh.prefon)。 否则,表so.w_agtpai_h_bo在字段" cod_coll"上具有一个auto_join。 所以我有两个不同的联接:
数字1:so.w_agtpai_h_bo.paie_h_num_prefon = rh.prefon.num_classe
数字2:@Prompt(...)中的so.w_agtpai_h_bo.cod_coll
在BI LaunchPad中生成的查询如下:
SELECT
*
FROM
so.w_agtpai_h_bo左外连接rh.prefon ON(so.w_agtpai_h_bo.paie_h_num_prefon = rh.prefon.num_classe和so.w_agtpai_h_bo.cod_coll in)(17)
如您所见,第二个联接包含在LEFT OUTER JOIN中,而UDT则不是这种情况! 结果是我的请求没有对值" 17001"的字段" cod_coll"进行过滤,因为它处于WHERE条件(或至少在OTUER JOIN之外)。
再次感谢您的帮助。
不太确定PostgreSQL问题是如何结束的。
但是,当您的查询只应在两个连接端都返回匹配项时,INNER JOIN是EQUI JOIN的正确执行。
仅当您要从连接的两端检索不匹配的记录时,才使用OUTER JOIN。
你好,
首先,谢谢您的回答。
我不确定我的问题是由PostGreSQL的行为引起的onyl,让我尝试用一个具体的例子来解释它。
对于这种情况,我正在使用您所说的OUTER JOIN,以便为两个表检索最大数量的值。 LaunchPad生成的请求返回以下语句(我尽力简化了):
选择*在哪里 )W_AGENT_BO ON(W_AGENT_BO.cod_clasremun = rh.eqrem.cod_clasremun 和(CASE当'*'='@'THEN W_AGENT_BO.dt_fin_doss-间隔'1天'
FROM
rh.eqrem右外连接(
(选择
SO.w_agent_bo。*
FROM SO.w_agent_bo
SO.w_agent_bo。 cod_coll in('17001')
和(CASE当'*'='@'THEN时SO.w_agent_bo.dt_deb_doss
当'*'='*'THEN date_trunc('day',current_date)
ELSE to_date('*','DD/MM/YYYY')END)> = SO.w_agent_bo.dt_deb_doss
并且(如果'*'='@'然后,则为例SO.w_agent_bo.dt_fin_doss-间隔" 1天"
当'*'='*'THEN date_trunc('day',current_date)
ELSE to_date('*','DD/MM/YYYY')END)
和W_AGENT_BO.cod_eqremun = rh.eqrem.cod_eqremun
和W_AGENT_BO.cod_typremun = rh_eq(' '@'THEN W_AGENT_BO.dt_deb_doss
当'*'='*'THEN date_trunc('day',current_date)
ELSE to_date('*','DD/MM/YYYY')END)
当'*'='*'THEN date_trunc('day',current_date )
ELSE to_date('*','DD/MM/YYYY')END)> = rh.eqrem.dat_debut AND(condition1)AND(condition2)
)
,我想发表以下声明:
选择*在哪里 )W_AGENT_BO ON(W_AGENT_BO.cod_clasremun = rh.eqrem.cod_clasremun 和(CASE当'*'='@'THEN W_AGENT_BO.dt_fin_doss-间隔'1天'
FROM
rh.eqrem右外连接(
(选择
SO.w_agent_bo。*
FROM SO.w_agent_bo
SO.w_agent_bo。 cod_coll in('17001')
和(CASE当'*'='@'THEN时SO.w_agent_bo.dt_deb_doss
当'*'='*'THEN date_trunc('day',current_date)
ELSE to_date('*','DD/MM/YYYY')END)> = SO.w_agent_bo.dt_deb_doss
并且(如果'*'='@'然后,则为例SO.w_agent_bo.dt_fin_doss-间隔" 1天"
当'*'='*'THEN date_trunc('day',current_date)
ELSE to_date('*','DD/MM/YYYY')END)
和W_AGENT_BO.cod_eqremun = rh.eqrem.cod_eqremun
和W_AGENT_BO.cod_typremun = rh_eq(' '@'THEN W_AGENT_BO.dt_deb_doss
当'*'='*'THEN date_trunc('day',current_date)
ELSE to_date('*','DD/MM/YYYY')END)
当'*'='*'THEN date_trunc('day',current_date )
ELSE to_date('*','DD/MM/YYYY')END)> = rh.eqrem.dat_debut)在(condition1)AND(condition2)
主要更改是在请求结束时,我不希望将" WHERE"条件包含在RIGHT OUTER JOIN内,因为这会修改我的condition1和condition2的行为。
这就是为什么我想使用" ="而不是INNER JOINS或OUTER JOINS保持初始等式联接的原因。或者您是否有任何想法像前面的示例所示"拆分" WHERE?
非常感谢您的参与。
R。
一周热门 更多>