【问题标题】:Select statement for over ride values from other table in Oracle从 Oracle 中的另一个表中选择覆盖值的语句
【发布时间】:2017-05-17 19:48:33
【问题描述】:

我有几张如下所示的表格:

表 1

Registration#   Name    Phone          Extension
1               John    111-111-2233   987
2               Peter   332-444-2232   345
3               John    323-987-8372   234
4               tom     841-654-9875   254

table2

Registration#   PersonalPhone   Extension   Company 
2               125-541-1241    123         ABC
3               125-965-8457    852         BVC

查询结果应该是

如果Where Condition Company=ABC

Registration#   Name    Phone   Extension      Company 
1               John    111-111-2233    987 
2               Peter   125-541-1241    123    ABC
3               John    323-987-8372    234 
4               tom     841-654-9875    254 

【问题讨论】:

    标签: sql oracle select inner-join


    【解决方案1】:

    您不想为此使用INNER JOIN,而是想使用LEFT JOIN 并将Company 的过滤器放在您的连接条件中。由于您还想从Table2 替换PhoneExtension(如果存在),因此您需要使用COALESCE 或类似的东西来覆盖Table1 中的这些值(如果它们被返回):

    select 
      t1."Registration#",
      t1.Name,
      coalesce(t2.PersonalPhone, t1.Phone) as Phone,
      coalesce(t2.Extension, t1.Extension) as Extension, 
      t2.Company
    from Table1 t1
    left join Table2 t2
      on t1."Registration#" = t2."Registration#"
      and t2.Company = 'ABC'
    order by t1."Registration#";
    

    这是demo

    【讨论】:

    • 投赞成票是因为您还发现了使用合并来更改分机号码的要求,我忽略了那部分
    【解决方案2】:

    不要让你的条件成为 WHERE 子句的一部分,而是让它成为 table1 和 table2 之间的左连接的条件

    SELECT * FROM
      table1 a
      LEFT JOIN
      table2 b
      ON
        a."registration#" = b."registration#" AND
        b.company = 'ABC' --parameterise this I.e. @companyName
    

    不要忘记参数化您的查询

    不要在列名中使用 # - 让它们在其他系统中使用时(尤其是)很麻烦,因为它们需要转义,而且在 oracle 中转义列意味着您必须启用案例 Bob。应该避免任何使查询更加脆弱的事情

    在某些版本的 oracle 中,它对您编写条件的方式很敏感(希望这只是古代版本中的一个错误)

    如果您遇到奇怪或意外的结果,请尝试:

    LEFT JOIN table2 ....
    ON 'ABC' = table2.companyname
    

    【讨论】:

    • 注意:有关使用合并替换匹配行的扩展号的更完整示例,请参见 ollies 答案。我错过了你的那部分要求
    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    相关资源
    最近更新 更多