SQL转换id并在join之前添加where语句

时间:2017-07-06 19:28:24

标签: mysql sql

我对SQL很新。对于很多人来说,这是一个我很确定的操作。我试图在同一服务器上的数据库中连接两个表 - dbB和dbA,以及TableA(带有IdA)和TableB(带有IdB)。但在此之前,我想将列IdA转换为数字,我想从其值中删除“:XYZ”字符,并为dbA中的另一列添加where语句。下面我展示了我的连接代码,但我不知道如何转换列的值。这样我就可以在联接中将idAidB匹配。非常感谢。

Select replace(idA, “:XYZ”, "")
from dbA.TableA guid
where event like “%2015”
left join dbB.TableB own
on guid.idA = own.idB

1 个答案:

答案 0 :(得分:4)

很少有事情

  1. FROM,Joins,WHERE(除非你使用子查询)语法顺序它也是执行的顺序(通知选择不按操作顺序列在其末尾,但首先是语法上的!)< / LI> 当涉及多个表时,
  2. 别名/完全限定列,因此我们知道哪个字段来自哪个表。
  3. 操作顺序让SQL执行from和JOINS 1st因此你在select中做的事情是不可用的(不在范围内)编译器,这就是你不能使用select列的原因也可以在from,where或者group by中包含别名。
  4. 我不喜欢Select *,但我不知道你真正需要哪些栏目......我在这里使用它。
  5. 至于加入之前的位置。大多数SQL编译器不再使用基于成本的优化,并根据您的数据表和未涉及的内容找出最佳执行计划。因此,只要将限制标准放在这种情况下的位置,因为它限制了左连接的左表。如果您需要限制左连接的右表中的数据,您可以对连接条件设置限制;从而允许它在加入时进行过滤。
  6. 可能需要将IDA转换为整数(或与IDB相同的类型)我使用trim来消除空格,但如果有其他非显示字符,则左连接匹配会出现问题)
  7. SELECT guild.*, own.*
    FROM dbA.TableA guid
    LEFT JOIN  dbB.TableB own
      on cast(trim(replace(guid.idA, ':XYZ', '')) as int) = own.idB
    WHERE guid.event like '%2015'
    

    或者首先使用子查询来实现转换,以便在连接之前将IDA置于其转换状态(如代数()的内容并从里到外处理)

    SELECT * 
    FROM (SELECT cast(trim(replace(guid.idA, ':XYZ', '')) as int) as idA
          FROM dbA.TableA guid
          WHERE guid.event like '%2015') B
    LEFT JOIN  dbB.TableB own
      on B.IDA  = own.idB