我有客户与合同在各种地点,这必须收费。
站点有两种类型的计费地址:按客户地址计费的站点和按其他地址计费的站点。站点的类型由字段“status”处理:如果站点在客户的地址收费,则该字段等于“C”。如果计费到不同站点的地址,则等于'A‘,'bill_site_id’字段将填充用于计费的'site_id‘。我想在一个查询中检索我必须向其发送账单的地址...
假设客户有两个站点(A指的是用于计费的B);请求显然显示了这两个站点,但我只想要一个用于计费的站点(B)。如何只检索这一个?
这是我的问题(匿名,所以请注意:-)
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发布于 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)
如果这没有任何意义,那么也许你可以发布一个所涉及的表的描述。
发布于 2011-09-02 00:40:04
从技术上讲,Union是两个查询,但你可以在一个命令中运行它,它应该做你想做的事情,所以我把它作为一个选项抛出。:)
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'我看不到您的表结构,所以可能会进行更多优化,但我认为这将帮助您指明工作方向。这可能不会比您现有的查询更快,但它更容易理解。
https://stackoverflow.com/questions/7271867
复制相似问题