【问题标题】:Oracle query --> Postgres same queryOracle 查询 --> Postgres 相同查询
【发布时间】:2019-02-21 19:16:32
【问题描述】:

之前我曾就我试图将其转换为 Postgres 查询的 Oracle 查询寻求帮助:

SELECT c.code, c.recommendation, s.suggested, s.sugg_by, a.approved, a.app_by
FROM (SELECT code, recommendation FROM recommendations) c,
     (SELECT code, suggested, sugg_by FROM suggestions) s,
     (SELECT code, approved, app_by FROM suggestions) a
WHERE c.code = s.code(+)
  AND c.code = a.code(+);

有人推荐了这个,效果很好:

SELECT
    c.code,
    c.recommendation, 
    s.suggested,
    s.sugg_by, 
    a.approved,
    a.app_by
FROM recommendations c 
LEFT JOIN suggestions s on c.code = s.code
LEFT JOIN suggestions a ON c.code = a.code;

我忘了提一件事:我需要在 USERS 表中添加一个连接来获取用户名。

sugg_by = u.user_id
app_by = u.user_id

所以,是这样的:

SELECT c.code, c.recommendation, s.suggested, s.sugg_by, s.full_name, a.approved, a.app_by, a.full_name
FROM (SELECT code, recommendation FROM recommendations) c,
     (SELECT code, suggested, sugg_by, full_name FROM suggestions s, users u WHERE s.sugg_by = u.user_id) s,
     (SELECT code, approved, app_by, full_name FROM approvals a, users u WHERE a.app_by = u.user_id) a
WHERE c.code = s.code(+)
  AND c.code = a.code(+);

基本上我还需要来自 USERS 表的名称。在 Oracle 中很容易,只需尝试为 Postgres 整合这些。

【问题讨论】:

标签: sql postgresql outer-join


【解决方案1】:

您可以像加入“普通”表引用一样加入查询:

SELECT c.code, 
       c.recommendation, 
       s.suggested, 
       s.sugg_by, 
       s.full_name, 
       a.approved, 
       a.app_by, 
       a.full_name
FROM recommendations c
  LEFT JOIN (
    SELECT code, suggested, sugg_by, full_name 
    FROM suggestions s 
      JOIN users u ON s.sugg_by = u.user_id
  ) s ON c.code = s.code
  LEFT JOIN (
    SELECT code, approved, app_by, full_name 
    FROM approvals a
      JOIN users u ON a.app_by = u.user_id
  ) a on c.code = a.code

但正如艾伦指出的那样:你真的不需要那些派生表(“子查询”)。使用显式 JOIN 运算符(或 LEFT JOIN)而不是 Oracle 古老且专有的 (+) 运算符(甚至 Oracle 建议停止使用它)更容易做到这一点。

【讨论】:

    【解决方案2】:

    您不需要所有的子查询:

    SELECT c.code,
           c.recommendation,
           s.suggested,
           s.sugg_by,
           su.full_name,
           a.approved,
           a.app_by,
           au.full_name
    FROM   recommendations c
           LEFT JOIN suggestions s ON c.code = s.code
           LEFT JOIN users su ON s.sugg_by = su.user_id
           LEFT JOIN approvals a ON c.code = a.code
           LEFT JOIN users au ON a.sugg_by = au.user_id;
    

    顺便说一句,这应该在 Oracle 和 Postgres 中都可以使用。

    【讨论】:

    • 效果很好!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 2016-10-12
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多