0

課金が必要なさまざまなサイトで契約している顧客がいます。

サイトの請求先住所には、顧客の住所で請求されるサイトと別の住所で請求されるサイトの 2 種類があります。サイトの種類はフィールド「ステータス」によって処理されます。サイトが顧客の住所で請求される場合、フィールドは「C」に等しくなります。別のサイトのアドレスに請求される場合、それは「A」に等しく、フィールド「bill_site_id」には請求に使用される「site_id」が入力されます。請求書の送付先住所を 1 回のクエリで取得したい...

顧客が 2 つのサイトを持っているとします (A は課金のための B を指します)。要求には明らかに 2 つのサイトが表示されますが、請求に使用するサイト (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
4

2 に答える 2

0

私はあなたが何を望んでいるのかを知っていると確信していますが、クエリで「ch.status」が何を指しているのか100%確信が持てません. また、与えられた情報からあなたが望むものを達成できるかどうかもわかりません...

うまくいけば、データ構造があなたの管理下にあるので、好きなように設定できます。

あなたの仕様を正しく読めば、クエリでサイト テーブルのインスタンスが 1 つだけ必要/必要だと思いますが、顧客の住所を特定する方法が明確ではありません。

これを回避する 1 つの方法は、サイト テーブルに main_address フラグを設定することです。(これはch.statusの混乱だと思います)

サイトテーブルにフラグがある場合...

WHERE c.idcompany = cwp.idcompany AND 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 ) )

別の方法は、顧客テーブルの外部キーとして Main Address と Billing address を持ち、ステータス フラグを忘れることです。

WHERE WP.SITE_ID = DECODE(C.BILLING_ADDRESS, NULL, C.MAIN_ADDRESS, C.BILLING_ADDRESS)

これが意味をなさない場合は、関連するテーブルの DESCRIBE を投稿できます。

于 2011-09-01T15:57:42.643 に答える
0

技術的にはユニオンは 2 つのクエリですが、1 つのコマンドで実行でき、必要な処理を実行できるはずなので、オプションとして除外します。:)

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'

私はあなたのテーブル構造を見ることができないので、おそらくもっと最適化することは可能ですが、それはあなたが作業方向を示すのに役立つと思います. これは、既存のクエリよりも高速ではない可能性がありますが、理解するのはかなり簡単です。

于 2011-09-01T16:40:03.987 に答える