当前位置: 首页 > 面试题库 >

复杂的左外部加入Oracle,转换为PostgreSQL

邴墨竹
2023-03-14
问题内容

我有一条来自Oracle + SAS环境的巨大SQL语句。我得到了大部分,但最让我困惑的是WHERE子句中的Left Outer Joins
/加号。我需要将其转换为Postgres。我可以处理代码的第一部分,这是使我感到困惑的联接。

SELECT
--A bunch of columns from several tables
FROM prd_acct_cmp_grp pacg,
    product_acct pa,
    customer_acct ca,
    (SELECT DISTINCT member_id, group_id
     FROM group_members
     WHERE group_id IN (33158, 27156, 35376, 36217)) gm,
    prd_acct_acct_cmp pac,
    pacg_usage pu,
    sales_hierarchy sh,
    sales_region sr
WHERE pacg.component_group_cd = 'AN'
  AND pacg.component_grp_val IN (%s) --string that is added in later
  AND pacg.product_account_id = pa.product_account_id
  AND pa.customer_acct_id = ca.customer_acct_id
  AND ca.customer_acct_id = gm.member_id(+) 
  AND pacg.product_account_id = pac.product_account_id
  AND pacg.occurencce_number = pac.occurence_number
  AND pac.prcmp_code = 'USAGE'
  AND pacg.component_group_cd = pu.component_group_cd(+) 
  AND pacg.component_grp_val = pu.component_grp_val(+) 
  AND ca.primary_sales_rep = sh.sales_rep_id(+) 
  AND sh.region_cd = sr.sales_region_code(+)

我知道从Oracle转换时如何进行简单的联接,但是,该联接中有多个相同表的实例正在进行联接比较,并且混合了许多不需要联接的条件。那么如何进行联接呢?语句结尾是否需要其他WHERE子句?

谢谢。


问题答案:

试试这个:

SELECT
--A bunch of columns from several tables
FROM prd_acct_cmp_grp pacg
JOIN product_acct pa
  ON pacg.product_account_id = pa.product_account_id
JOIN customer_acct ca
  ON pa.customer_acct_id = ca.customer_acct_id
JOIN prd_acct_acct_cmp pac
  ON pacg.product_account_id = pac.product_account_id
 AND pacg.occurencce_number = pac.occurence_number
 AND pac.prcmp_code = 'USAGE'
LEFT JOIN (SELECT DISTINCT member_id, group_id
           FROM group_members
           WHERE group_id IN (33158, 27156, 35376, 36217)) gm
  ON ca.customer_acct_id = gm.member_id
LEFT JOIN sales_hierarchy sh
  ON ca.primary_sales_rep = sh.sales_rep_id
LEFT JOIN sales_region sr
  ON sh.region_cd = sr.sales_region_code
LEFT JOIN pacg_usage pu  
  ON pacg.component_group_cd = pu.component_group_cd
 AND pacg.component_grp_val = pu.component_grp_val
WHERE pacg.component_group_cd = 'AN'
  AND pacg.component_grp_val IN (%s) --string that is added in later


 类似资料:
  • 问题内容: 怪异的 (可能一点也不奇怪) 我有3个对象,即Employee,Rota和Department。 并不复杂,真的。Rota可以分配一个员工和/或部门,所有这些都使用Fluent进行配置。我所有的关联都是正确的(架构是完美的),但是我有一个奇怪的怪异之处。 当我执行并查看生成的SQL时,在Employee&Rota上有一个 LEFT OUTER JOIN 。为什么在那儿? 我不希望它这样

  • 问题内容: 我有一个应用程序,该应用程序使用Jackson将我的复杂对象编组为JSON,从而在DynamoDB中存储一些数据。 例如,我要编组的对象可能如下所示: SomeObject可能看起来像这样: 和SomeOtherObject可能看起来像这样: 可以很好地将对象整理成问题并将其作为JSON字符串存储在数据库中。 当需要从DynamoDB检索数据时,Jackson会自动检索JSON并将其转

  • 某个物体可能看起来像这样: 另一个物体可能是这样的: 这很好,因为对象被封送,没有问题,并以JSON字符串的形式存储在DB中。

  • 我将两个表上的连接定义为左外部连接,以便所有记录都从左表返回,即使它们在右表中没有记录。不过,我还需要包含一个where子句,但是...即使不满足where子句中的条件,我仍然希望为左侧表中的每个记录返回左侧表中的一行。有办法做到这一点吗? 我正在编写带有联接条件的查询,如下所示 以上条件不返回任何行。其中如下条件返回... 输出应为

  • 问题内容: 我没主意了。现在,我有一天在Google上进行了谷歌搜索,但仍然找不到我的问题的任何有用答案。 到目前为止,我一直尝试使用原始SQL,但是没有运气。 使用此原始SQL查询时,返回的结果为零,但是在其中运行相同的查询时,返回正确的结果。 我进一步发现,将查询打印到终端时,它不能正确处理该子句。 打印时我的查询如下所示: 如何将此SQL查询转换为SQLAlchemy 我的桌子看起来像这样:

  • 我正在尝试将复杂的实体转换为Dto。我想从DTO中删除实体中的一些值。 我的实体看起来像这样(为了简单起见,省略了实体的大部分): 我找到了一个对简单实体非常有效的解决方案:将实体转换为数据。如果我采纳了自定义拦截器的建议,删除id或整个item属性就可以了。 我尝试了两种方法来定义我的DTO: < li >它仅返回id和整个项目。 现在的问题是我只想删除 item 属性中的某些值。例如,私有字段