0

テーブル名: REG_NBRS

STATE        CITY      COUNTRY   REG_NBR
------------------------------------------
ILLINOIS               USA       444333222
NEBRASKA               USA       111222333
             NEW YORK  USA       333444555
FLORIDA                USA       666222666
             TAMPA     USA       888333888

このようなデータがあり、その州または都市の REG_NBR を取得する必要があります。行が州と市の両方に一致する場合、市が優先されます。州または市のいずれにも一致しない場合は、reg_nbr が null の行をリストする必要があります。クエリを考え出そうとしましたが、外部結合を行うときに優先度を課す方法がわからないため、あまり成功しませんでした。

SELECT C.NAME, C.AGE, RN.REG_NBR
  FROM CUSTOMER C, REG_NBRS RN
 WHERE C.COUNTRY = RN.COUNTRY
   AND (C.STATE = RN.STATE OR C.CITY = RN.CITY)
   AND C.ID BETWEEN 1000 AND 2000

初心者なので、これら 2 つのテーブルを結合する方法がわかりません。

  1. STATE と City で最初に結合します
  2. それでも1000行すべてをリストします
  3. これらの州または都市からのものではない登録番号に null を入力します
  4. 両方が一致する場合は、州の登録番号を使用します (つまり、TAMPA のエントリが見つかったとしても、Tampa には 666222666 を使用します)。

これが意味をなさない場合は申し訳ありませんが、可能な限り説明しようとしました。左外部結合と右外部結合のさまざまな組み合わせも試しましたが、WHERE条件に階層を課す方法がわかりませんでした。私は UNIONS を考えましたが、ユニオンでも REG_NBR の両方を持つタンパの顧客に対して 2 つの行をリストすると思います。助言がありますか?

この質問を投稿するために(そうではない)スマートフォンを使用しているため、ごちゃごちゃしたコードについてお詫び申し上げます。

4

1 に答える 1

1

(Country, State) と (Country, City) に一意のキーがあると仮定すると、2 回結合することで簡単に実行できます。

SELECT 
  C.NAME, C.AGE,
  COALESCE(RN1.REG_NBR, RN2.REG_NBR) AS REG_NBR
FROM CUSTOMER C
LEFT OUTER JOIN REG_NBRS RN1
  ON RN1.COUNTRY = RN1.COUNTRY
 AND RN1.STATE = C.STATE
LEFT OUTER JOIN REG_NBRS RN2
  ON RN2.COUNTRY = C.COUNTRY 
 AND RN2.CITY = C.CITY 
WHERE C.ID BETWEEN 1000 AND 2000

さらに、これは、データベースがあまり好まない OR よりも高速である必要があります (少なくとも適切なインデックスが配置されている場合)。

于 2013-09-26T19:08:27.963 に答える