首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle中的外连接和自引用

Oracle中的外连接和自引用
EN

Stack Overflow用户
提问于 2011-09-01 22:33:12
回答 2查看 291关注 0票数 0

我有客户与合同在各种地点,这必须收费。

站点有两种类型的计费地址:按客户地址计费的站点和按其他地址计费的站点。站点的类型由字段“status”处理:如果站点在客户的地址收费,则该字段等于“C”。如果计费到不同站点的地址,则等于'A‘,'bill_site_id’字段将填充用于计费的'site_id‘。我想在一个查询中检索我必须向其发送账单的地址...

假设客户有两个站点(A指的是用于计费的B);请求显然显示了这两个站点,但我只想要一个用于计费的站点(B)。如何只检索这一个?

这是我的问题(匿名,所以请注意:-)

代码语言:javascript
复制
SELECT CASE wp.status
      WHEN 'A'
         THEN wp2.name
      ELSE c.NAME
   END AS NAME,
   CASE wp.status
      WHEN 'A'
         THEN wp2.adress
      ELSE c.street
   END AS street,
   CASE wp.status
      WHEN 'A'
         THEN wp2.city
      ELSE c.city
   END AS city,
   CASE wp.status
      WHEN 'A'
         THEN wp2.postcode
      ELSE c.postcode
   END AS postcode
FROM customer c, site wp, site wp2, customer_site cwp
WHERE c.idcompany = cwp.idcompany
    AND cwp.site_id = wp.site_id
    AND wp2.site_id(+) = wp.bill_site_id
    AND c.idcompany = :someId
GROUP BY wp.status,
     wp2.name,
     wp2.adress,
     wp2.city,
     wp2.postcode
EN

回答 2

Stack Overflow用户

发布于 2011-09-01 23:57:43

我非常确定我知道您想要什么,但不能100%确定'ch.status‘在查询中指的是什么。此外,我不确定从给出的信息,你可以实现你想要的…

希望数据结构在您的控制之下,这样您就可以随心所欲地设置它。

如果我正确地阅读了您的规范,那么我认为您在查询中只想要/需要站点表的一个实例,但是不清楚您如何识别客户的地址。

解决这个问题的一种方法是让站点表具有main_address标志。(我想这就是围绕ch.status的困惑所在)

如果站点表上有标志,则...

其中c.idcompany = cwp.idcompany和cwp.site_id = wp.site_id AND ( (C.STATUS = 'C‘AND WP.MAIN_ADDRESS = 1) OR (C.STATUS = 'A’AND WP.SITE_ID = C.BILL_SITE_ID) )

另一种方法是将主地址和账单地址作为customer表上的外键,并忽略状态标志,如下所示:

其中WP.SITE_ID =解码(C.BILLING_ADDRESS,NULL,C.MAIN_ADDRESS,C.BILLING_ADDRESS)

如果这没有任何意义,那么也许你可以发布一个所涉及的表的描述。

票数 0
EN

Stack Overflow用户

发布于 2011-09-02 00:40:04

从技术上讲,Union是两个查询,但你可以在一个命令中运行它,它应该做你想做的事情,所以我把它作为一个选项抛出。:)

代码语言:javascript
复制
SELECT c.Name AS NAME, c.street AS STREET, c.city AS CITY, c.postcode AS postcode
FROM customer c
INNER JOIN customer_site cwp ON c.idcompany = cwp.idcompany
INNER JOIN site wp ON cwp.site_id = wp.site_id
WHERE c.idcompany = :someid AND wp.status = 'C'
UNION
SELECT wp2.name AS NAME, wp2.adress AS STREET, wp2.city AS CITY, wp2.postcode AS postcode
FROM customer c
INNER JOIN customer_site cwp ON c.idcompany = cwp.idcompany
INNER JOIN site wp ON cwp.site_id = wp.site_id
INNER JOIN site wp2 ON wp.bill_site_id = wp2.site_id
WHERE c.idcompany = :someid AND wp.status = 'A'

我看不到您的表结构,所以可能会进行更多优化,但我认为这将帮助您指明工作方向。这可能不会比您现有的查询更快,但它更容易理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7271867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档