Oracle中的外连接和自引用

Oracle中的外连接和自引用,oracle,outer-join,self-join,Oracle,Outer Join,Self Join,我有客户与合同在不同的网站,必须收费 站点有两种类型的计费地址:按客户地址计费的站点和按其他地址计费的站点。 站点类型由“状态”字段处理:如果站点按客户地址收费,则该字段等于“C”。如果该费用计入其他站点的地址,则等于“a”,并且“账单站点id”字段中填写了用于计费的“站点id”。我想在一个查询中检索我必须发送账单的地址 假设一个客户有两个站点(a是指B用于计费);请求显然显示了这两个站点,但我只想要一个用于计费的站点(B)。 如何仅检索此文件 这是我的问题(匿名,所以请温和:-) 我很确定我知

我有客户与合同在不同的网站,必须收费

站点有两种类型的计费地址:按客户地址计费的站点和按其他地址计费的站点。 站点类型由“状态”字段处理:如果站点按客户地址收费,则该字段等于“C”。如果该费用计入其他站点的地址,则等于“a”,并且“账单站点id”字段中填写了用于计费的“站点id”。我想在一个查询中检索我必须发送账单的地址

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

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


我很确定我知道你想要什么,但我不能100%确定“ch.status”在查询中指的是什么。同时,我也不确定从所提供的信息来看,你是否能达到你想要的

希望数据结构在您的控制之下,以便您可以按照自己的意愿进行设置

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

其中一种方法是站点表有一个主地址标志。(我认为这是对中国地位的困惑)

如果站点表上有标志,则

其中c.idcompany=cwp.idcompany 和cwp.site\u id=wp.site\u id 及( (C.STATUS='C'和WP.MAIN_ADDRESS=1)或 (C.STATUS='A'和WP.SITE\u ID=C.BILL\u SITE\u ID) )

另一种方法是将主地址和账单地址作为外键放在客户表上,并忽略状态标志,以便:

其中WP.SITE\u ID=解码(C.BILLING\u地址,NULL,C.MAIN\u地址,C.BILLING\u地址)


如果这没有意义,那么也许您可以发布相关表的描述。

从技术上讲,联合是两个查询,但您可以在一个命令中运行它,它应该做您想做的事情,因此我将它作为一个选项扔掉。:)


我看不到您的表结构,因此可能需要进行更多优化,但我认为这将帮助您找到工作方向。这可能不会比您现有的查询快很多,但是它更容易理解。

(+)=
语法太旧了。Oracle中有
LEFT
RIGHT
连接,现在已经有好几年了。是的,但是在我的应用程序中到处都使用老式语法,我不想改变每个人这样做的方式。。。无论如何,我已经尝试了一个简单的左连接,结果是一样的。“ch”的别名是什么表?好吧,我完全不明白这个问题。比如,“A指B”是什么意思?为什么在FROM子句中有两次表“site”?表“site”不能自我引用。或者神谕是个说谎者,因为它禁止我这样做;我必须添加此表两次才能获得帐单地址。这可能会有帮助,但该标志仅在“站点”表上,我无法更改表结构。。。我会尝试发布一个匿名的表格描述。
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
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'