通过从另一个表的结果中替换查找来更新表外键

时间:2014-12-30 14:32:28

标签: sql oracle

假设我有两个表:

表1:

SELECT * FROM ORIGINAL_DEALER;

    ID ENAME

----- --------------------------
    1 JOHN
    2 00000JOHN
    3 JACK
    4 00000JACK
    5 MARIA
    6 00000MARIA

表2:

SELECT * FROM NAMES;

ID_NUM
------
 1
 2
 3
 4
 5
 6
  1. 我必须更新NAMES
  2. ORIGINAL_DEALER具有重复/无效的名称,例如 00000JOHN     无效名称在有效名称前面有五个零前缀。即有效名称:JOHN      名称无效:00000JOHN
  3. 现在我必须从中选择无效名称的ID ORIGINAL_DEALER表并更新ID_NUM表中的NAMES WITH VALID ID。即当无效ename= '00000JOHN'的{​​{1}}也无效时。但是original_dealer是父表,我必须用有效的NAMES表替换所有无效的id 的。
  4. ,更新NAMES后的输出应为:

    ID
    = 2

    如果没有手动设置它,我怎么能这样做,因为会有大量数据? 我正在使用Oracle DB

1 个答案:

答案 0 :(得分:1)

通过使用内部查找子查询,您可以使用带有如下所示的查找的更新语句,而内部查找子查询又使用TRIM函数在匹配期间去除前导零。我们还将更新限制为仅与NamesOriginalDealer开头的00000记录UPDATE Names SET ID_NUM = (SELECT od1.ID FROM OriginalDealer od1 INNER JOIN OriginalDealer od2 ON od1.EName = TRIM(LEADING '0' FROM od2.EName) WHERE od2.ID = Names.ID_NUM) WHERE EXISTS ( SELECT 1 FROM OriginalDealer od WHERE od.ENAME LIKE '00000%' AND Names.ID_NUM = od.ID ); ,以最大限度地降低不必要更新的风险。

00000NAME

SqlFiddle here

请注意,标记重复的模型带有前缀如' 00000'相当脆弱:

  • 假设NAME
  • 中的ORIGINAL_DEALERNames.ID_NUM行之间只有一个匹配项
  • 如果上述情况不正确,则会尝试将{{1}}设置为NULL或失败,如果有多个匹配(这可能是一件好事,我们不想腐败的数据)