【问题标题】:LEFT/RIGHT join rewrite- Oracle to Postgres migration左/右加入重写-Oracle 到 Postgres 迁移
【发布时间】:2018-02-01 11:58:54
【问题描述】:
select info.HOUSE_HOLD_ID as HOUSE_HOLD_ID,info.HOUSE_HOLD_NAME 
             as HOUSE_HOLD_NAME,city.CITY_NAME as CITY_NAME,info.FIELD_AREA as FIELD_AREA,
             cdar.resource_name as FIELD_AUDITOR_NAME,cdar.supervisor_name as SUPERVISOR_NAME,
             info.STATUS as STATUS,con.PHONE_NO AS PHONE_NO,con.CELL_NO AS CELL_NO
             from INFORMATION info,CONTACT con,CITY city,
             resource cdar
             where cdar.productid(+)=info.field_auditor_id
             and info.country_id=170 
             and con.country_id=170 and city.country_id=170 
             and info.HOUSE_HOLD_ID=con.HOUSE_HOLD_ID 
             and info.city_id=city.city_id
             and (upper(info.HOUSE_HOLD_ID) like upper('%%') 
                  or upper(info.HOUSE_HOLD_NAME) like upper('%%') or upper(city.CITY_NAME)
                  like upper('%%') or upper(con.PHONE_NO) like upper('%%') 
                  or upper(con.CELL_NO) like upper('%%')
                  or upper(info.FIELD_AREA) like upper('%%') 
                  OR upper(info.STATUS) in ('1','2','3','4') 
                  OR upper(cdar.RESOURCE_NAME) like upper('%%'))

我们正在将上述查询从 Oracle 转换为 Postgres,我想在查询之外单独写入 cdar.productid(+)=info.field_auditor_id,例如在此处使用 LEFT/RIGHT join。很抱歉从我们的应用程序中粘贴所有这样的代码。

【问题讨论】:

  • 嗨。如果您使用 use (+) 但不是在给定条件下使用所有出现的表别名,那么您将获得内连接而不是左连接。请参阅左连接的文档。所以这段代码不做左连接。请阅读minimal reproducible example 并采取行动。也请不要在你没有足够的抱歉来付出适当的努力时说你很抱歉。
  • 如果我理解得更好,我会给出一些例子。 @philipxy 我不能这样复制。
  • 您的问题到底是什么? “在查询之外单独写”不清楚。您只想在语法上使用联接而不是 (+) 吗?你在哪里被困在阅读什么 (+) & left join on do 并应用它?如果你有问题,那是什么?什么是最小的 DDL,有该问题的示例输入 & 输出 & 查询?此外,既然您知道您的查询实际上并没有进行左连接,那么您想要执行该查询的代码还是想要实际执行左连接的代码?如果是前者,只需去掉 (+);否则你想要什么?--你没有说或显示。

标签: postgresql outer-join postgresql-9.4


【解决方案1】:

将其转换为标准 SQL 连接,如下所示:

SELECT ...
FROM information info
   JOIN contact con ON info.house_hold_id = con.house_hold_id
   JOIN city city ON info.city_id = city.city_id
   LEFT JOIN resource cdar ON cdar.productid = info.field_auditor_id
WHERE ...

WHERE 子句中删除连接条件。

【讨论】:

  • 我对这个问题的第一条评论指出,由于他们没有在每次出现 cdar 时都使用 (+),所以 (+) 被忽略了。重新清楚标题表明他们正在将 (+) 映射到外部连接的问题,但问题的措辞是您猜测的一团糟。
  • 这是一个准确的观察,我确实在猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2012-02-14
  • 2017-02-10
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多