【问题标题】:Complex Left Outer Joins in Oracle, converting to PostgreSQLOracle 中的复杂左外连接,转换为 PostgreSQL
【发布时间】:2015-06-30 18:05:31
【问题描述】:

我有这个庞大的 SQL 语句,来自 Oracle+SAS 环境。我得到了大部分内容,但最让我困惑的是 WHERE 子句中的左外连接/加号。我需要将其转换为 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 子句吗?

谢谢。

【问题讨论】:

  • 内联是你的朋友。 FROM prd_acct_cmp_grp pacg 内部连接 ​​product_acct pa ON pacg.product_account_id = pa.product_account_id。等等...
  • @Chuck:里面有一些左连接。这就是让它变得更加复杂的原因。
  • 是的,使用 (+) 的地方是左外连接

标签: sql oracle postgresql join


【解决方案1】:

试试这个:

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

【讨论】:

  • 我试试看!不幸的是,要等很长时间才能对其进行测试,但我会看看它在语法上是否有意义。
  • @BJ 这里的逻辑是将每个FROM table1, table2 WHERE table1.x = table2.y转换成FROM table1 INNER JOIN table2 ON (table1.x = table2.y)。如果WHERE 术语有(+),请使用LEFT OUTER JOIN 和左侧的(+)'d 表。我认为。我忘了甲骨文有那种奇怪的语法。
  • @Craig:信不信由你,曾经有一段时间我只知道如何使用这种奇怪的语法进行左连接。我实际上认为 ANSI 连接语法丑陋且难以理解。显然,当时我出了点问题。
  • @sstan 只是表明你习惯的东西很重要。
  • 让与我一起工作的顽固的 Oracle 人员编写 ANSI 连接?我有更多机会让我两岁的女儿学习 PL/SQL。
猜你喜欢
  • 2016-05-12
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 2016-12-19
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多