簡體   English   中英

SQL(Oracle)在where子句上施加層次結構

[英]SQL (oracle) imposing hierarchy on where clause

表名稱: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

作為一個初學者,我不知道如何以這種方式連接這兩個表

  1. 它首先加入了STATE和City
  2. 但仍列出所有1000行
  3. 將非來自那些州或城市的注冊號碼設為空
  4. 如果兩者都匹配,則使用州的注冊號(即,即使您可以找到TAMPA的條目,也要使用666222666坦帕)

很抱歉,如果這沒有道理,但我已盡力解釋。 我還嘗試了左外部聯接和右外部聯接的不同組合,但無法獲得如何為WHERE前提強加層次結構的方法。 我想到了UNIONS,但我認為即使是工會也會為坦帕的兩個REG_NBR客戶列出兩行。 有什么建議么?

我正在使用一個(不是這樣的)智能手機來張貼這個問題,請為混亂的代碼表示歉意。

假設您在(國家/地區,州/省)和(國家/地區,城市)具有唯一的鍵,則可以通過兩次以下簡單的方式來實現:

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更快(至少在適當的索引位置)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM