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

作为初学者,我不知道如何以这样的方式连接这两个表

  1. 它首先加入了 STATE 和 City
  2. 但仍然列出所有 1000 行
  3. 将 null 到那些不是来自那些州或城市的注册号码
  4. 如果两者都匹配,则使用州的注册号码(即坦帕使用 666222666,即使我们可以找到坦帕的条目)

如果这没有意义,我很抱歉,但我已尝试尽可能多地解释。我还尝试了左外连接和右外连接的不同组合,但不知道如何为 WHERE 组合施加层次结构。我想到了 UNIONS,但我认为即使是工会也会为坦帕的一位客户列出 2 行,其中包含两个 REG_NBR。有什么建议么?

为混乱的代码道歉,因为我正在使用(不是这样)智能手机发布这个问题。

4

1 回答 1

1

假设您在 (Country, State) 和 (Country, City) 中有唯一的键,您可以通过加入两次以简单的方式做到这一点:

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 回答