查询时如何防止生成INNER JOIN?

2020-09-28 09:27发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我面临以下问题:在PostGreSQL DB的UDT中,我正在两个表(例如A.column1 = B.column1)之间创建经典的等联接,当我使用LaunchPad查询时,它将转换联接 在"内部联接"中。

如何避免这种转变?

感谢您的帮助。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我面临以下问题:在PostGreSQL DB的UDT中,我正在两个表(例如A.column1 = B.column1)之间创建经典的等联接,当我使用LaunchPad查询时,它将转换联接 在"内部联接"中。

如何避免这种转变?

感谢您的帮助。

付费偷看设置
发送
4条回答
SC_Yao
1楼 · 2020-09-28 10:05.采纳回答

最后我找到了解决方案!

我已经在Universe的参数中将参数" SELFJOINS_IN_WHERE"添加为值"是"(参数ANSI_92也必须切换为"是"),并在.PRM文件中添加了此参数(对于我而言) ,即postgresql.prm)。

我已经导出了Universe,从现在开始它可以正常运行。

感谢Lars的帮助。

R。

hengyuye
2楼-- · 2020-09-28 09:59

你好,

我们当前正在使用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之外)。

再次感谢您的帮助。

代楠1984
3楼-- · 2020-09-28 10:05

不太确定PostgreSQL问题是如何结束的。

但是,当您的查询只应在两个连接端都返回匹配项时,INNER JOIN是EQUI JOIN的正确执行。

仅当您要从连接的两端检索不匹配的记录时,才使用OUTER JOIN。

追夢秋陽
4楼-- · 2020-09-28 10:16

你好,

首先,谢谢您的回答。

我不确定我的问题是由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?

非常感谢您的参与。


R。

一周热门 更多>