需要了解oracle中的查询

时间:2018-10-23 13:00:44

标签: oracle

SELECT DISTINCT 'update loc_final_2 set county = ''' || TRIM(upper(county) ) || ''' 
    where city = '''
|| TRIM(upper(city) ) || ''' and state = ''' || TRIM(upper(state) ) || ''';'
FROM audtr_rgn_assgnmnts; 
commit

有人可以告诉我上面的查询做什么。有一个名为loc_final_2的表,另一个名为audtr_rgn_assgnmnts的表。我不了解查询的内容,因此需要改进此查询。但是在此之前,我必须了解它在做什么。我还需要知道提交到底在做什么。

1 个答案:

答案 0 :(得分:0)

查询正在尝试使用audtr_rgn_assgnmnts中的值为表loc_final_2生成多个更新语句。 我不确定为什么commit在那里存在,因为查询没有被执行。

如果查询的原始编码器的意图是运行多个更新,那么我会说这是错误的方法。像这样的单个更新/合并将更加简单和高效。

UPDATE loc_final_2 l
SET
     county = (
          SELECT upper(TRIM(county) ) --Add MIN/MAX if there are multiple rows 
          FROM audtr_rgn_assgnmnts a
          WHERE l.city = upper(TRIM(a.city) ) AND l.state = upper(TRIM(a.state) )
     );


MERGE INTO loc_final_2 t USING audtr_rgn_assgnmnts s ON (
     l.city = upper(TRIM(a.city) ) AND l.state = upper(TRIM(a.state) )
)
WHEN MATCHED THEN UPDATE SET t.county = UPPER(TRIM(s.county));

如果有多行,则需要在USING

中进行选择
MERGE INTO loc_final_2 t USING (
     SELECT DISTINCT city,
                     state,
                     upper(TRIM(s.county) ) AS county
     FROM audtr_rgn_assgnmnts
)
s ON (
     l.city = upper(TRIM(a.city) ) AND l.state = upper(TRIM(a.state) )
)
WHEN MATCHED THEN UPDATE SET t.county = s.county;

编辑

  

查询中的3个单引号是什么

Oracle中的文字引号需要使用另一个单引号转义。 因此,如果您的最终查询需要使用a='b'之类的东西,则生成该字符串的表达式应该是a=||'''b||'''之一,本身就是一个引号,以转义该引号,另一部分为串联。

  

因为最小/最大只能用于数字,对吧?

MAXMIN可以用于字符串。在这里我说过您可以使用它来避免内部查询返回的相同县的重复值。如果您不想使用DISTINCT,也可以选择MIN/MAX